django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除

运维使用docker部署好之后FastDFS分布式文件系统之后,提供给我接口如下:

fastdfs  tracker 192.168.1.216   192.168.1.217  storage 192.168.1.216  192.168.1.217

我们只需要在配置文件中进行配置即可,然后利用客户端提供的接口通过简单的代码就可以将文件上传到分布式文件系统中

至于内部实现机制,可以参考我的另外一篇博客:分布式文件系统Fastdfs原理及部署

再次提醒在安装客户端可能会遇到各种不可控的因素,导致你上传失败,在windows中在进行安装客户端fdfs_client模块或在linux安装fdsff_client模块之后,在使用接口时都可能会出现问题,小伙伴们可以在使用时自行踩坑,我只介绍我踩坑之后最终的实现方法,即可绕过踩坑,介绍流程包括fastdfs客户端的安装、配置、django中调用相应的接口

一、客户端Fastdfs客户端的安装

因客户端模块在自行安装会出现问题,所以我提供该客户端的模块,下载链接:fast_client模块

进入fdfs_client-py-master.zip所在目录

pip install fdfs_client-py-master.zip

pip install mutagen

pip install requests

配置文件在django项目中的存放位置:

配置文件client.conf中的内容个如下,需要做修改的部分已用红色进行标注:

# connect timeout in seconds
# default value is 30s
connect_timeout=30

# network timeout in seconds
# default value is 30s
network_timeout=60

# the base path to store log files
#客户端存放日志目录,可自行设置
base_path=/Users/delron/Desktop

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
#改成自己的ip即可,配置一个即可tracker会自行帮助我们进行任务调度
tracker_server=192.168.1.217:22122

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false

# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600

# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false

# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false

# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf

#HTTP settings
http.tracker_server_port=80

#use "#include" directive to include HTTP other settiongs
##include http.conf

二、在djaogo中使用fastdf接口实现增、删、改,下载

自定义文件,以下仅供参考:

以下是实现分布式文件系统实现文件的上传、修改、删除的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/4/26 10:09
# @Author  : suihongliang
# @Site    :
# @File    : fastdfs_service.py
# @Software: PyCharm
"""
使用fastdfs分布式文件存储系统实现文件的上传、下载、删除
"""
from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client
from utils.logger_utils import get_logging

logger = get_logging(__name__)

@deconstructible
class FastDFSStorage(Storage):
    def __init__(self, client_conf=None):
        """
        初始化
        :param client_conf: FastDFS客户端配置文件的路径
        """
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

    # def upload(self, content):
    #     """
    #     在FastDFS中保存文件
    #     :param content: 通过
    #     :return: 保存到数据库中的FastDFS的文件名
    #     """
    #     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")
    #     return file_name

    def upload(self, local_path):
        """
        将文件上传到fastdfs分布式文件系统中
        :param local_path: 上传文件的本地路径
        :return:
        """
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_file(local_path)
        logger.info(ret)
        print(ret)
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")
        remote_file_id = ret.get("Remote file_id")
        logger.info("存储在fastdfs上的文件路径:", remote_file_id)

        return True, remote_file_id

    def update(self, local_path, remote_file_id):
        """
        对修改后的文件进行更新
        :param local_path:
        :param remote_file_id:
        @return: dictionary {
            ‘Status‘     : ‘Modify successed.‘,
            ‘Storage IP‘ : storage_ip
        }
        """
        client = Fdfs_client(self.client_conf)
        try:
            local_path=bytes(local_path.encode("utf-8"))
            remote_file_id=bytes(remote_file_id.encode("utf-8"))
            ret_update = client.modify_by_file(local_path, remote_file_id)
            logger.info("文件更新成功",ret_update)
            return True, ret_update
        except Exception as e:
            logger.warning(u‘文件更新失败,错误信息:%s‘ % repr(e))
            return None, "文件更新失败"

    def download(self, local_path, remote_file_id):
        """
        从fastdfs分布式文件系统进行下载文件
        :param local_path: 本地保存文件路径
        :param remote_file_id: 上传到fastdfs文件系统中自动生成的文件路径即文件id
        @return dict {
            ‘Remote file_id‘  : remote_file_id,
            ‘Content‘         : local_filename,
            ‘Download size‘   : downloaded_size,
            ‘Storage IP‘      : storage_ip
        }
        """
        client = Fdfs_client(self.client_conf)
        try:
            ret_download = client.download_to_file(local_path, remote_file_id)
            return True, ret_download

        except Exception as e:
            logger.warning(u‘文件下载失败,错误信息:%s‘ % repr(e))
            return None, "文件下载失败"

    def delete(self, remote_file_id):
        """
        从fastdfs分布式文件系统中将文件删除
        :param remote_file_id: 上传到fastdfs文件系统中自动生成的文件路径即文件id
        @return tuple (‘Delete file successed.‘, remote_file_id, storage_ip)
        """
        client = Fdfs_client(self.client_conf)
        try:
            ret_delete = client.delete_file(remote_file_id)
            return ret_delete

        except Exception as e:
            logger.warning(u‘文件删除失败,错误信息:%s‘ % repr(e))
            return None

在django创建的settings中需要做的配置信息如下:

可以根据自己代码实现进行相应的配置:

# fastdf配置文件设置
#
DEFAULT_FILE_STORAGE = ‘distributedstorage.utils.fastdfs.fdfs_storage.FastDFSStorage‘

# FastDFS
# fastdfs  tracker 192.168.1.212   192.168.1.213  storage 192.168.1.212  192.168.1.213
# FDFS_CLIENT_CONF = os.path.join(BASE_DIR, ‘utils/fastdfs/client.conf‘)
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, ‘client.conf‘)

在调用接口时,传递相应的参数即可完成文件的上传、下载、删除和更新,成功使用客户端进行文件的增、删、改和下载后返回文件的参数见上述代码。

原创不易,转载需说明,希望对你有所帮助!

原文地址:https://www.cnblogs.com/sui776265233/p/10795188.html

时间: 2024-12-26 20:48:12

django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除的相关文章

FastDFS分布式文件系统(主要用作图片上传)

1.安装FastDFS # 安装tracker docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs youkou1/fastdfs tracker # 安装storage docker run -dti --network=host --name storage -e TRACKER_SERVER=10.0.2.15:22122 -v /var/fdfs/storage:/var/fdfs yo

Java中实现文件上传下载的三种解决方案

第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null; String fileAddre="/numUp"; try { InputStream stream = file.getInputStream();// 把文件读入 String filePath = request.getRealPath(fileAddre);//取系统当前路径

300行python代码的轻量级HTTPServer实现文件上传下载

最近,利用一下空余的时间对以前的Python知识进行了巩固和复习,便闲来无事写了一个轻量级的HTTPServer来实现文件上传下载,不废话,直接上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- __version__ = "0.1" __all__ = ["SimpleHTTPRequestHandler"] __author__ = "kumikoda" __home_page__ = &qu

linux中文件上传下载

windows篇 linux文件下载到windows sz命令 登录到linux服务器使用 sz log.log 命令,弹出对话框选择下载文件的目录,点击确定即可. windows文件上传到linux rz命令 登录到linux服务器使用rz命令,弹出文件选择对话框,选择windows本地的要上传的文件,点击打开即可上传文件到linux服务器. mac篇 linux文件下载到mac 使用scp命令 scp  [email protected]:/usr/local/nginx-1.14.0.ta

spring boot(十八)集成FastDFS文件上传下载

上篇文章介绍了如何使用Spring Boot上传文件,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包配置 我们使用Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0. <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</art

python接口自动化7-post文件上传

前言 文件上传在我们软件是不可少的,最多的使用是体现在我们后台,当然我们前台也会有.但是了解过怎样上传文件吗?这篇我们以禅道文档-创建文档,上传文件为例. post请求中的:Content-Type:multipart/form-data  这种类型便是上传文件. 一.环境安装.抓包分析 1.pip install requests_toolbelt,post请求 multipart/form-data  类型 C:\Users\Administrator>pip install request

JAVA中使用FTPClient实现文件上传下载

在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保([email protected])创建 * @param url FTP服务器hostname

javaWeb中的文件上传下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

Java代码实现文件上传(转载)

刚刚发表了一篇Java发送电子邮件,以前真是没注意,commons里这么多常用项目,惭愧呀,直到现在回顾;要学习的真是太多了,还是缺少真正的学习能力... 这里用到的是commons-fileupload.jar与commons-io.jar;下载地址http://commons.apache.org/ 这是一个web工程,所以先在webroot下新建一个jsp,其实直接用index.jsp就行了;下面是前端代码: <%@ page language="java" import=