场景
- 我们默认使用fastdfs 保存上传的文件(默认已经安装好fastdfs,不展开讲这些,先把django的业务实现)
- 我们知道,fastdfs上传文件,会返回给我们一个 url链接,用来访问此文件
# 1. 导入FastDFS客户端扩展
from fdfs_client.client import Fdfs_client
# 2. 创建FastDFS客户端实例
client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
# 3. 调用FastDFS客户端上传文件发放
ret = client.upload_by_filename('/Users/zhangjie/Desktop/kk.jpeg')
ret = {
'Group name': 'group1',
'Remote file_id': 'group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg',
'Status': 'Upload successed.',
'Local file name': '/Users/zhangjie/Desktop/kk.jpeg',
'Uploaded size': '69.00KB',
'Storage IP': '192.168.103.158'
}
ret = {
'Group name': 'Storage组名',
'Remote file_id': '文件索引,可用于下载',
'Status': '文件上传结果反馈',
'Local file name': '上传文件全路径',
'Uploaded size': '文件大小',
'Storage IP': 'Storage地址'
}
当我们存储图片的时候:
-
默认的文件存储是在本地磁盘上,这是不理想的,因为读取速度非常慢。 所以要是用fastdfs,分布式文件存储系统。 让他来帮我们存储文件。
-
所以我们需要自定义文件存储系统,使文件通过 fastdfs存储。
怎么自定义文件存储系统?
-
打开官方文档:编写自定义存储系统
-
文档很清晰的描述了(我希望在这之前,你已经看那完了默认存储系统的文档资料,了解默认存储系统)
再来看一下 storage类:
-
fastdfs 响应的是:‘group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg’,这样的url,也就是说,我们在 模型类中 ImageField字段中,实际存储的就是这样的 字符串,而 文件本身通过存储系统,保存在其他地方。
-
我们现在要做的就是重写一个 url方法,让他返回给我们的 文件路径是完整的,带上 域名:
from django.core.files.storage import Storage
from django.conf import settings
class FdfsStorage(Storage):
def open(self, name, mode='rb'):
pass
# 这个方法,我们也可以改为上面的 fastdfs存储图片的方法
def save(self, name, content, max_length=None):
pass
def url(self, name):
return settings.FDFS_URL + name