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/'

 

posted @ 2020-04-24 20:49  10132714  阅读(508)  评论(0编辑  收藏  举报