此次搭建的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[]
md5sum = zip_file_tuple[]
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()
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('/', )[]
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 == :
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 上传文件
3.5 删除文件
4 题外话
我本意是想转存文件,返回新的URL,似乎使用nginx的upload模块也可以实现,但是我还未验证,此处只是一个记录。
1. https://blog.csdn.net/blog_liuliang/article/details/78846579