使用fastdfs+django+nginx存储文件

此次搭建的fastdfs主要是为了转存由于时间过期会失效的URL中的文件。在服务器上搭建一个单机的fastdfs,然后通过django+nginx来将其包装成服务。该服务接收URL,下载URL中的文件,存储于fastdfs,返回fastdfs的新URL给客户端。客户端能够访问新的URL并下载文件。

1. 搭建

网上的搭建教程很多,在此不再多说,以下是搭建时参考过的。

使fastdfs给出的链接能够在浏览器访问,需要配置nginx
1. https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label4_0 (查阅概念即可)
2. http://www.blogjava.net/Alpha/archive/2016/08/02/430008.html
3. https://blog.csdn.net/liu_zhaoming/article/details/72802936

需要注意的时,nginx中配置的监听端口需要和client.conf中的http.tracker_server_port端口保持一致。

2. django服务

fastdfs的存储采用执行命令,从命令中正则得到URL的做法来实现django与fastdfs的交流,不需要下载fastdfs的客户端,非常地简单粗暴!upload.py的内容如下:

import os
import time
import requests
import hashlib
import traceback
import sys
import re
import json
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse


@csrf_exempt
def start(request):
    date = time.strftime('%Y%m%d')
    UPLOAD_FILE_PATH = '/home/**/FDFS-upload/%s/' % date
    isExists = os.path.exists(UPLOAD_FILE_PATH)
    if not isExists:
        os.makedirs(UPLOAD_FILE_PATH)
    else:
        print('path isexist!')

    request_params = (request.body).decode('utf-8')
    request_params = json.loads(request_params)
    print(request_params)
    url = request_params['url']
    zip_file_tuple = download_log(url, UPLOAD_FILE_PATH)
    if zip_file_tuple:
        zip_file_name = zip_file_tuple[0]
        md5sum = zip_file_tuple[1]
    else:
        return JsonResponse({})
    file_name = os.path.join(UPLOAD_FILE_PATH, zip_file_name)
    print('file name:' + file_name)
    std = os.popen("fdfs_test /etc/fdfs/client.conf upload %s" %file_name).read()
    print('*********** fastdfs excute start ***********')
    print(std)
    print('*********** fastdfs excute end ***********')
    match = re.search('.*?example file url: (\S+)', std)
    if match:
        download_url = match.group(1)
        response = dict()
        response['url'] = download_url
        return JsonResponse(response)
    else:
        return JsonResponse({})


def download_log(uri, dest_dir):
    try:
        os.makedirs(dest_dir, exist_ok=True)
        zip_name = uri.rsplit('/', 1)[1]
        zip_whole_name = os.path.join(dest_dir, zip_name)
        r = requests.get(uri)
        fd = open(zip_whole_name, 'wb')
        fd.write(r.content)
        fd.close()
        md5sum = hashlib.md5(r.content).hexdigest()
    except Exception as ex:
        traceback.print_exc(file=sys.stdout)
        return None
    if r.status_code == 404:
        return None
    return (zip_whole_name, md5sum)

3.使用

3.1 启动

sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
ps -ef |grep fdfs

3.2 停止

千万不要使用-9参数强杀,否则可能会导致binlog数据丢失的问题。

直接kill即可让server进程正常退出,可以使用killall命令,例如:

killall fdfs_trackerd
killall fdfs_storaged
也可以使用如下命令:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop

3.3 重启

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

3.4 上传文件

fdfs_test /etc/fdfs/client.conf upload /home/software/qq.jpg

3.5 删除文件

fdfs_delete_file client.conf group1/M00/00/00/rBGIplr5eAyAJnj8AAAODlyCsTE880_big.cnf

4 题外话

我本意是想转存文件,返回新的URL,似乎使用nginx的upload模块也可以实现,但是我还未验证,此处只是一个记录。
1. https://blog.csdn.net/blog_liuliang/article/details/78846579

阅读更多
换一批

没有更多推荐了,返回首页