运维使用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')

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

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

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

  1. Java 客户端操作 FastDFS 实现文件上传下载替换删除

    FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...

  2. SpringMVC中使用 MultipartFile 进行文件上传下载及删除

    一:引入必要的包 <!--文件上传--> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fil ...

  3. java中的文件上传下载

    java中文件上传下载原理 学习内容 文件上传下载原理 底层代码实现文件上传下载 SmartUpload组件 Struts2实现文件上传下载 富文本编辑器文件上传下载 扩展及延伸 学习本门课程需要掌握 ...

  4. Django文件上传下载与富文本编辑框

    django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...

  5. 一、手把手教你docker搭建fastDFS文件上传下载服务器

    在搭建fastDFS文件上传下载服务器之前,你需要准备的有一个可连接的linux服务器,并且该linux服务器上已经安装了docker,若还有没安装docker的,先百度自行安装docker. 1.执 ...

  6. FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...

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

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

  8. django 12天(跨域,文件上传,下载,cookie,session)

    django 12天(跨域,文件上传,下载) 跨域 什么是跨域 1.协议不同 2.端口不同 3.主机不同 如何解决跨域 1.安装django-cors-headers模块 2.在settings.py ...

  9. Python接口自动化——文件上传/下载接口

    〇.前言 文件上传/下载接口与普通接口类似,但是有细微的区别. 如果需要发送文件到服务器,例如:上传文档.图片.视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: mul ...

随机推荐

  1. 高级PHP工程师所应该具备的专业素养

    初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...

  2. 图形 - bootStrap4常用CSS笔记

    .rounded 图片显示圆角效果 .rounded-circle 设置椭圆形图片 .img-thumbnail 设置图片缩略图(图片有边框) .img-fluid 响应式图片 .float-righ ...

  3. VS Code配置初探

    之前一直在用 Webstorm,看现在 VS Code 热度那么高,想着尝试一下. 熟悉编辑器的快捷键 VS Code 快捷键一览 安装使用到的插件 Chinese(修改你的编辑器语言,默认英文) E ...

  4. Pod的创建过程

    Pod是kubernetes中最小的调度单位,里面包含多个容器,也是真正运行你服务的仓库,同一个pod中容器之间资源共享(IP .网络.cpu.mem.挂载目录等). 1.  准备一个yaml(RC/ ...

  5. JavaWeb-Servlet-Tomcat

    Servlet就是运行在服务器上的Java类.Servlet容器为javaweb应用提供运行时环境,负责管理Servlet和JSP的生命周期,以及管理它们的共享数据. Servlet容器软件——Tom ...

  6. CS224n学习笔记1——深度自然语言处理

    一.什么是自然语言处理呢? 自然语言处理是计算机科学家提出的名字,本质上与计算机语言学是同义的,它跨越了计算机学.语言学以及人工智能学科. 自然语言处理是人工智能的一个分支,在计算机研究领域中,也有其 ...

  7. SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换

    作者介绍 虫洞社区·签约作者 steven bai 前言 如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情? 目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网 ...

  8. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

  9. java内存结构JVM——java内存模型JMM——java对象模型JOM

    JVM内存结构 Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区 ...

  10. 转载---LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

    总是分不太清楚LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别,每次都是现查一下,转载到这里,备忘... 转载自:https://www.cnblogs.com/panfeng4 ...