Django中使用fastDFS
http://www.mamicode.com/info-detail-2468256.html
安装与配置
请自行百度
启动tracker和storage
sudo service fdfs_trackerd start
sudo service fdfs_storaged start
上传文件
fdfs_upload_file /etc/fdfs/client.conf +(要上传的文件路径)
配合nginx使用时
启动nginx
sudo /usr/local/nginx/sbin/nginx
关闭
sudo /usr/local/nginx/sbin/nginx -s stop
在Python中使用fastDFS
1. 下载fdfs_client-py-master.zip
下载地址:https://github.com/jefforeilly/fdfs_client-py
2. 安装:在中单切换到zip所在的文件夹下,
pip install fdfs_client-py-master.zip
如果报错请参考:https://blog.csdn.net/weixin_30583563/article/details/97461165
3. 使用时nginx无法正常工作请参考
https://blog.csdn.net/u013255206/article/details/78248612?utm_source=blogxgwz8
https://www.cnblogs.com/bkylkh/p/10876498.html
默认上传文件类是FileSystemStorage类,上传路径为Media_root。可以通过继承FileSystemFile的父类Storage来重写其方法,从而扩展成我们想要的类。
在新建的项目路径下的文件夹utils中创建一个fdfs包,在里面创建py文件,storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
class FDFSStorage(Storage):
'''fastdfs文件存储类'''
def _open(self, name, mode='rb'):
'''打开文件时使用'''
pass
def _save(self, name, content):
'''保存文件时使用'''
# name:你选择上传的文件的名字
# content:包含你上传文件内容的File对象
# 创建一个Fdfs_client对象,该对象是用来将文件上传到fastdfs的类,需要为其指定一个配置文件
# 配置文件client.conf是复制过来的,注意修改里面的base_path和tracker_server
client = Fdfs_client('./utils/fdfs/client.conf')
# 上传文件 到fastdfs系统中
# upload_by_file上传指定文件
res = client.upload_by_buffer(content.read()) # 根据内容上传文件,因为content是file对象,所以用这个方法
# 上传成功的返回结果如下
"{‘Group name‘: ‘group1‘, " \
"‘Remote file_id‘: ‘group1/M00/00/02/CtM3BVr-k6SACjAIAAJctR1ennA809.png‘, " \
"‘Status‘: ‘Upload successed.‘, " \
"‘Local file name‘: ‘/Users/delron/Desktop/1.png‘, " \
"‘Uploaded size‘: ‘151.00KB‘, ‘Storage IP‘: ‘10.211.55.5‘}"
if res.get('Status') != 'Upload successed.':
# 上传失败
raise Exception('上床文件失败')
filename = res.get('Remote file_id')
# 返回存储在fastdfs的文件名
return filename
def exists(self, name):
'''Django判断文件名是否可用'''
# 因为文件名是存储在fastDFS中的,所以在Django中不存在是否可用的问题,直接返回False即可
return False
def url(self, name):
# name是save方法返回的filename
# name加上nginx服务器地址,就可以构造出一个完整的图片url
return 'http://192.168.2.227:8888' + name
settings.py中要配置:
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage' # 自己定义的类的位置
优化上述代码
storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from Dailyfresh.settings import FDFS_CLIENT_CONF, BASE_URL
class FDFSStorage(Storage):
'''fastdfs文件存储类'''
def __init__(self, client_conf=FDFS_CLIENT_CONF, base_url=BASE_URL):
self.client_conf = client_conf
self.base_url = base_url
def _open(self, name, mode='rb'):
'''打开文件时使用'''
pass
def _save(self, name, content):
'''保存文件时使用'''
# name:你选择上传的文件的名字
# content:包含你上传文件内容的File对象
# 创建一个Fdfs_client对象,该对象是用来将文件上传到fastdfs的类,需要为其指定一个配置文件
# 配置文件client.conf是复制过来的,注意修改里面的base_path和tracker_server
client = Fdfs_client(self.client_conf)
# 上传文件 到fastdfs系统中
# upload_by_file上传指定文件
res = client.upload_by_buffer(content.read()) # 根据内容上传文件,因为content是file对象,所以用这个方法
# 上传成功的返回结果如下
"{‘Group name‘: ‘group1‘, " \
"‘Remote file_id‘: ‘group1/M00/00/02/CtM3BVr-k6SACjAIAAJctR1ennA809.png‘, " \
"‘Status‘: ‘Upload successed.‘, " \
"‘Local file name‘: ‘/Users/delron/Desktop/1.png‘, " \
"‘Uploaded size‘: ‘151.00KB‘, ‘Storage IP‘: ‘10.211.55.5‘}"
if res.get('Status') != 'Upload successed.':
# 上传失败
raise Exception('上床文件失败')
filename = res.get('Remote file_id')
# 返回存储在fastdfs的文件名
return filename
def exists(self, name):
'''Django判断文件名是否可用'''
# 因为文件名是存储在fastDFS中的,所以在Django中不存在是否可用的问题,直接返回False即可
return False
def url(self, name):
# name是save方法返回的filename
# name加上nginx服务器地址,就可以构造出一个完整的图片url
return self.base_url + name
settings.py
# 配置Django存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
# 配置client_conf的文件路径,在storage.py中使用
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
# 配置nginx的ip和端口号,在storage.py中使用
BASE_URL = 'http://192.168.2.227:8888/'