前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-番外篇-FastDFS文件存储

Django实战-番外篇-FastDFS文件存储

作者头像
小团子
发布2019-07-18 16:15:28
1.2K0
发布2019-07-18 16:15:28
举报
文章被收录于专栏:数据云团数据云团

FastDFS 是一个轻量级的开源分布式文件系统;FastDFS 主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现均衡负载;FastDFS 实现了软件方式的 RAID,可以使用廉价的 IDE 硬盘进行存储;支持存储服务器在线扩容;支持相同内容的文件只保存一份,节约磁盘空间;FastDFS 特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等);FastDFS 是一个开源的轻量级分布式文件系统,由跟踪服务器、存储服务器和客户端三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务。

一、 安装 FastDFS

① 下载地址

代码语言:javascript
复制
https://github.com/happyfish100/fastdfs/releases

② 解压 FastDFS

代码语言:javascript
复制
# cd /usr/local/src/ 
# tar -zxvf FastDFS_v5.05.tar.gz 
# cd FastDFS 

③ 下载 libfastcommon

下载地址

代码语言:javascript
复制
https://github.com/happyfish100/libfastcommon

④ 解压 libfastcommon

代码语言:javascript
复制
# cd /usr/local/src/ 
# unzip libfastcommon-master.zip 

⑤ 编译、安装

(编译前要确保已经成功安装了 libfastcommon)

代码语言:javascript
复制
# cd FastDFS 
# ./make.sh 
# ./make.sh install 

采用默认安装的方式安装,安装后的相应文件与目录

因为FastDFS服务脚本设置的bin目录是 /usr/local/bin,但实际命令安装在 /usr/bin,可以进入 /user/bin 目录使用以下命令查看fdfs的相关命令:

代码语言:javascript
复制
# cd /usr/bin/ 
# ls | grep fdfs 

二、django 集成 FastDFS

代码语言:javascript
复制
pip install fdfs_client-py==1.2.6

① fastdfs存储工具类

代码语言:javascript
复制
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
代码语言:javascript
复制
class FastDFSStorage(Storage):
    """fastdfs存储工具类, 提供给django使用"""
    def __init__(self, client_conf=None, fastdfs_url=None):
        """初始化,设置参数"""
        if client_conf is None:
            client_conf = settings.FASTDFS_CLIENT
        self.client_conf = client_conf

        if fastdfs_url is None:
            fastdfs_url = settings.FASTDFS_URL

        self.fastdfs_url = fastdfs_url

    def _open(self, name, mode='rb'):
        """打开文件时使用"""
        pass

    def _save(self, name, content):
        """保存文件时使用"""
        # content是用户上传过来的文件对象, 如果想获取文件的内容,使用read方法读取

        # 创建fastdfs客户端的工具对象
        client = Fdfs_client(self.client_conf)

        # 借助client客户端,向fastdfs发送文件
        file_data = content.read()  # 读取文件内容
        try:
            ret = client.upload_by_buffer(file_data)
        except Exception as e:
            print(e)
            raise

        # {'Group name': 'group1', 'Status': 'Upload successed.', 'Remote file_id': 'group1/M00/00/00/
        #  wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'
        #     , 'Storage IP': '192.168.243.133'}
        # 根据返回值进行判断
        if ret.get("Status") == "Upload successed.":
            # 表示上传到fastdfs服务器成功
            file_id = ret.get("Remote file_id")
            # 将文件名返回,django会保存到数据库中
            return file_id
        else:
            # 表示上传到fastdfs服务器时出现了问题
            raise Exception("上传FastDFS服务器出现问题")

    def exists(self, name):
        """django用来判断文件是否存在"""
        return False

    def url(self, name):
        """返回文件的完整路径名,django会调用"""
        return self.fastdfs_url + name

② fastdfs 参数配置

在项目的 settings.py 文件中配置

代码语言:javascript
复制
# 使用的文件存储工具
DEFAULT_FILE_STORAGE = "utils.fastdfs.storage.FastDFSStorage"

# FastDFS使用的配置信息
FASTDFS_CLIENT = os.path.join(BASE_DIR, "utils/fastdfs/client.conf")
FASTDFS_URL = "http://192.168.108.57:8888/"

③ 配置 Nginx

代码语言:javascript
复制
# connect timeout in seconds
# default value is 30s
connect_timeout=30

network_timeout=60

base_path=/Users/delron/Desktop

tracker_server=192.168.108.57: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 settings
http.tracker_server_port=80

#use "#include" directive to include HTTP other settiongs
##include http.conf
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档