Django对接FastDFS
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务
web框架为Django,我选择将静态资源存放在fastdfs上面
1.我们先在web服务主文件夹下面创建一个fastdfs文件夹,再在里面创建一个配置文件:clint.conf
#配置文件内容如下
connect_timeout=30
network_timeout=60
base_path=/home/FastDFS/fd_storage/data #指定服务器存放的地址
tracker_server=12.34.567.897:22122 #服务器IP地址 端口为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 #默认80端口
2.在web项目的settings下面添加配置
#重写DJango引擎文件,
DEFAULT_FILE_STORAGE = 'Web_API.views.FastDFSStorage' #在视图层重写的底层函数
# 上传之后的访问链接 80端口可以不写 个人的fastdfs是什么端口就写什么端口
FDAS_URL = 'http://12.34.567.897/'
#fdfs的指明路径,fdfs的配置文件
FDFS_CLIENT_CONF = (
os.path.join(BASE_DIR, 'fastdfs/clint.conf'),
)
CKEDITOR_UPLOAD_PATH = '' # 上传图片保存路径,使用了fastDFS上传,设置为''
3.重写DJango底层storage函数(storage是ImageField底层上传静态文件的函数)
from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
class FastDFSStorage(Storage): #重写Djnago底层storage
"""定义FastDFS客户端类"""
def __init__(self, base_url=None, client_conf=None):
"""
初始化对象
:param base_url:
:param client_conf:
"""
self.base_url = settings.FDAS_URL
# 'http://12.34.567.897/
self.client_conf = settings.FDFS_CLIENT_CONF
# FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'fastdfs/clint.conf')
def _open(self, name, mode = 'rb'):
"""
打开文件
:param name:
:param mode:
:return:
"""
pass
def _save(self, name, content):
"""
保存文件
:param name: 传入文件名
:param content: 文件内容
:return:保存到数据库中的FastDFSDE文件名
"""
#链接对象
client = Fdfs_client(self.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")
#将文件返回fastdfs
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
再次通过ImageField上传图片,我们发现数据库中保存的是文件的地址映射,通过浏览器访问地址我们可以直接访问到fastdfs的图片
注意:fastdfs能上传图片的前提是必须要在服务器上先部署好且能运行,不然是没办法上传的