Django + FastDFS (分布式远程服务器存储文件)

之前随笔过一篇Docker来搭建分布式文件系统FastDfs就跳过了

https://www.cnblogs.com/xcsg/p/10901461.html

FastDFS的Python  (django客户端)

1.安装依赖

#安装库
pip install py3Fdfs
pip install mutagen
pip isntall requests

2.配置settings.py

# 激活重写存储文件引擎方法
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
# 图片存阿里云的地址
FDAS_URL = 'http://39.97.117.229:8888/'

# 存进阿里云服务器里因为没有后缀(jpg/png),图片连接要放进 img 标签里才能显示
# <img src="http://39.106.64.101:8888/group1/M00/00/00/rBHmx10A9JmAVEKNAABf71XWOL06003319" alt=""># 配置 Fastdfs 配置文件
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'client.conf')

3.配置client.conf 文件

connect_timeout=30
network_timeout=60
tracker_server=39.97.117.229:22122
log_level=info
use_connection_pool = false
connection_pool_max_idle_time = 3600
load_fdfs_parameters_from_tracker=false
use_storage_id = false
storage_ids_filename = storage_ids.conf
http.tracker_server_port=80

4.封装上传文件 fastdfs.py

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client,get_tracker_conf
from video_back.settings import FDAS_URL,FDFS_CLIENT_CONF

# 重写存储引擎方法
class FastDfsStroage(Storage):

    def __init__(self, base_url = None, client_conf = None):
        """
            初始化对象
            :param base_url:
            :param client_conf:
        """
        if base_url is None:
            base_url = FDAS_URL
            # 'http://39.106.64.101:8888/'
        self.base_url = base_url

        if client_conf is None:
            client_conf = FDFS_CLIENT_CONF
            # FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'client.conf')
        self.client_conf = client_conf


    def _open(self, name, mode = 'rb'):
    
        """
            打开文件
            :param name:
            :param mode:
            :return:
        """
        pass

    def _save(self,content):
        """
            保存文件
            :param name: 传入文件名
            :param content: 文件内容
            :return:保存到数据库中的FastDFSDE文件名
        """
 
        client = Fdfs_client(get_tracker_conf(FDFS_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")
        #byte转str
        file_name = str(file_name,encoding = "utf-8")
        return file_name


    def exists(self, name):
        """
            检查文件是否重复, FastDFS自动区分重复文件
            :param name:
            :return:
        """
        return False

    def url(self, name):
        """
            获取name文件的完整url
            :param name:
            :return:
        """
        return self.base_url + name

5.上传逻辑views.py

#导入封装类
from .fastdfs import *
from django.http import JsonResponse
def upload(request):
    img = request.FILES.get('file')
    img_fast = FastDfsStroage()
    #存入远程服务器
    ret = img_fast._save(img)
    #返回存入图片的url
    url = img_fast.url(ret)
    if url:
        return JsonResponse({'url':url})

效果如下:

 

posted @ 2019-08-18 00:26  Xcsg  Views(1120)  Comments(0Edit  收藏  举报