<table class="text">
<tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 自定义存储系统 1)需要继承自django.core.files.storage.Storage 2)支持Django不带任何参数来实例化存储类,也就是说任何设置都应该从django.conf.settings中获取 3)存储类中必须实现_open()和_save()方法,以及任何后续使用中可能用到的其他方法。 4)需要为存储类添加django.utils.deconstruct.deconstructible装饰器 #setting配置 DEFAULT_FILE_STORAGE = '自定义存储类' # FastDFS FDFS_URL = 'http://image.meiduo.site:8888/' #是fdfs访问的路由,可以自己配置 FDFS_CLIENT_CONF = os.path.join(BASE_DIR,'utils/fastdfs/client.conf') ''' _open(name,mode='rb')被Storage.open()调用,在打开文件时被使用 _save(name,content)被Storage.save()调用,name是传入的文件名,content是Django接收到的文件内容,该方法需要将content文件内容保存 exists(name)如果名为name的文件在文件系统中存在,则返回True,否则返回False。 url(name)返回文件的完整访问URL delete(name)删除name的文件 listdir(path)列出指定路径的内容 size(name)返回name文件的总大小 ''' @deconstructible class FastDFSStorage(Storage): def __init__(self,base_url=None,client_conf=None): """ 初始化 :param base_url: 用于构造图片完整路径使用,图片服务器的域名 :param client_conf: FastDFS客户端配置文件的路径 """ if base_url is None: base_url = settings.FDFS_URL self.base_url = base_url if client_conf is None: client_conf = settings.FDFS_CLIENT_CONF self.client_conf = client_conf def _save(self,name,content): """ 在FastDFS中保存文件 :param name: 传入的文件名 :param content: 文件内容 :return: 保存到数据库中的FastDFS的文件名 """ client = Fdfs_client(self.client_conf) ret = client.upload_by_buffer(content.read()) if ret.get("Status") != "Upload successed.": raise Exception("upload file Failed") file_name = ret.get("Remote file_id") return file_name def url(self,name): """ 返回文件的完整URL路径 :param name: 数据库中保存的文件名 :return: 完整的URL """ return self.base_url + name def exists(self,name): """ 判断文件是否存在,FastDFS可以自行解决文件的重名问题 所以此处返回False,告诉Django上传的都是新文件 :param name: 文件名 :return: False """ return False