文件储存API:https://yiyibooks.cn/xx/django_182/ref/files/storage.html
编写自定义存储系统:https://yiyibooks.cn/xx/django_182/howto/custom-file-storage.html
定义一个自定义的储存类步骤
1.你的自定义储存类必须是django.core.files.storage.Storage的子类
2.Django必须能够不带任何参数来实例化你的储存类。这意味着任何设置都应该从django.conf.settings中获取。
3.你的储存类必须实现 _open() 和 _save()方法,以及任何适合于你的储存类的其它方法。
4.你的储存类必须是 可以析构的,所以它在迁移中的一个字段上使用的时候可以被序列化。只要你的字段拥有自己可以序列化的参数,你就可以为它使用django.utils.deconstruct.deconstructible类装饰器(这也是Django用在FileSystemStorage上的东西)。
自定义储存类
创建工具包utils/fdfs包
复制客户端的配置文件client.conf到fdfs的包里
修改client.conf配置文件
# the base path to store log files 记录日志文件 必须要有这个目录 base_path=/home/python/bj18/ttsx/dailyfresh/log # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address tracker_server=192.168.137.130:22122
需要创建一个日志文件的目录/home/python/bj18/ttsx/dailyfresh/log
settings.py中配置文件路径
# 设置django文件存储类 DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage' # 设置fdfs使用的client.conf路径 FDFS_CLIENT_CONF = './utils/fdfs/client.conf' # 设置fdfs存储服务器上nginx的IP和端口号 FDFS_URL = '192.168.137.130:8888'
在fdfs/storage.py中导入settings配置初始化FDFSStorage类
from django.core.files.storage import Storage # 导入storage工具类 from fdfs_client.client import Fdfs_client # 客户端上传的类 from django.conf import settings # 导入django配置 class FDFSStorage(Storage): # 创建上传类继承Storage类 '''fast dfs文件存储类''' def __init__(self, client_conf=None, base_url=None): if client_conf is None: self.client_conf = settings.FDFS_CLIENT_CONF if base_url is None: self.base_url = settings.FDFS_URL def _open(self, name, mode='rb'): # 必须要有的方法 '''打开文件时使用''' pass def _save(self, name, content): # 必须要有的方法 '''存储文件时使用''' # name: 你选择上传的文件的名字 # content:参数必须为django.core.files.File或者File子类的实例 即:包含你上传文件内容的file类的对象 # 创建一个Fdfd_client对象 client = Fdfs_client(self.client_conf) # 上传文件到fast dfs系统中 # upload_by_buffer() 根据文件内容上传文件 res = client.upload_by_buffer(content.read()) # 返回的是一个字典格式 # dict # { # 'Group name': group_name, # 'Remote file_id': remote_file_id, # 'Status': 'Upload successed.', # 'Local file name': '', # 'Uploaded size': upload_size, # 'Storage IP': storage_ip # } print(res) if res.get('Status') != 'Upload successed.': # res.get()获取字典里的内容 # 上传失败 抛出异常 raise Exception('上传文件到fdfs失败') # 获取文件id filename = res.get('Remote file_id') # 返回文件id return filename def exists(self, name): # 调用_save()前会先调用exists()方法 '''django判断文件名是否可用''' return False; # False表示没有这个文件名 该文件名可用 def url(self, name): # 如果没有这个 在admin显示详情的时候会报url()的错 '''返回文件url路径''' return name
进入后台192.168.137.130:8000/admin
添加图片看效果