文件储存API:https://yiyibooks.cn/xx/django_182/ref/files/storage.html

编写自定义存储系统:https://yiyibooks.cn/xx/django_182/howto/custom-file-storage.html

定义一个自定义的储存类步骤

1.你的自定义储存类必须是django.core.files.storage.Storage的子类

2.Django必须能够不带任何参数来实例化你的储存类。这意味着任何设置都应该从django.conf.settings中获取。

3.你的储存类必须实现 _open() 和 _save()方法,以及任何适合于你的储存类的其它方法。

4.你的储存类必须是 可以析构的,所以它在迁移中的一个字段上使用的时候可以被序列化。只要你的字段拥有自己可以序列化的参数,你就可以为它使用django.utils.deconstruct.deconstructible类装饰器(这也是Django用在FileSystemStorage上的东西)。

自定义储存类

创建工具包utils/fdfs包

复制客户端的配置文件client.conf到fdfs的包里

修改client.conf配置文件

# the base path to store log files 记录日志文件 必须要有这个目录
base_path=/home/python/bj18/ttsx/dailyfresh/log # tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
tracker_server=192.168.137.130:22122

需要创建一个日志文件的目录/home/python/bj18/ttsx/dailyfresh/log

settings.py中配置文件路径

# 设置django文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
# 设置fdfs使用的client.conf路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
# 设置fdfs存储服务器上nginx的IP和端口号
FDFS_URL = 'http://192.168.137.130:8000/'

在fdfs/storage.py中导入settings配置初始化FDFSStorage类

from django.core.files.storage import Storage  # 导入storage工具类
from fdfs_client.client import Fdfs_client # 客户端上传的类
from django.conf import settings # 导入django配置 class FDFSStorage(Storage): # 创建上传类继承Storage类
'''fast dfs文件存储类'''
def __init__(self, client_conf=None, base_url=None):
if client_conf is None:
self.client_conf = settings.FDFS_CLIENT_CONF
if base_url is None:
self.base_url = settings.FDFS_URL def _open(self, name, mode='rb'): # 必须要有的方法
'''打开文件时使用'''
pass def _save(self, name, content): # 必须要有的方法
'''存储文件时使用'''
# name: 你选择上传的文件的名字
# content:参数必须为django.core.files.File或者File子类的实例 即:包含你上传文件内容的file类的对象 # 创建一个Fdfd_client对象
client = Fdfs_client(self.client_conf)
# 上传文件到fast dfs系统中
# upload_by_buffer() 根据文件内容上传文件
res = client.upload_by_buffer(content.read()) # 返回的是一个字典格式
# dict
# {
# 'Group name': group_name,
# 'Remote file_id': remote_file_id,
# 'Status': 'Upload successed.',
# 'Local file name': '',
# 'Uploaded size': upload_size,
# 'Storage IP': storage_ip
# }
print(res)
if res.get('Status') != 'Upload successed.': # res.get()获取字典里的内容
# 上传失败 抛出异常
raise Exception('上传文件到fdfs失败')
# 获取文件id
filename = res.get('Remote file_id')
# 返回文件id
return filename
def exists(self, name): # 调用_save()前会先调用exists()方法
'''django判断文件名是否可用'''
return False; # False表示没有这个文件名 该文件名可用 def url(self, name): # 如果没有这个 在admin显示详情的时候会报url()的错
'''返回文件url路径'''
return self.base_url+name # 一定要加上路径 不然会导致src导入图片的时候没有路径不显示

进入后台192.168.137.130:8000/admin

添加图片看效果

django-自定义文件上传存储类的更多相关文章

  1. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  2. python Django之文件上传

    python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...

  3. spring mvc 文件上传工具类

    虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...

  4. 文件上传工具类 UploadUtil.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  5. FastDFS 文件上传工具类

    FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...

  6. day56:django:csrf_token&文件上传

    目录 1.csrf介绍 2.django实现csrf_token认证 3.django实现文件上传 csrf介绍 什么是csrf? csrf:跨站请求伪造.攻击者通过HTTP请求将数据传送到服务器,从 ...

  7. Django的文件上传以及预览、存储

    思路: 文件上传通过前端的input标签,input设置display:none属性. 内容显示需要让前端通过<img>标签读取图片内容,可以通过<label>标签连接< ...

  8. PHP封装一个通用好用的文件上传处理类

    封装一个文件上传类完成基本功能如下: 1.可上传多个或单个文件 2.上传成功返回一个或多个文件名 3.上传失败则返回每个失败文件的错误信息 上传类中的基本功能: 1.构造参数,用户可以自定义配置参数, ...

  9. HTML5文件上传器,纯脚本无插件的客户端文件上传器---Uploader 文件上传器类

    概述 客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由 ...

随机推荐

  1. find命令实例

    按时间查找也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间. 这里的时间是以24小时为单位的. 查找最近30分钟修改的当前目录下的.php文件 find . -n ...

  2. SQlL Server ----- 通过年月进行查询

    websit  中的代码. 不修改 对控件进行修改,展示年月 WdatePicker({ dateFmt: 'yyyy-MM', isShowToday: false, isShowClear: fa ...

  3. [教程]Tensorflow + win10 + CPU + Python3.6+ 安装教程

    由于各种原因,清华镜像源已经彻底挂掉了,但是目前网上的各种教程基本上都是采取设置清华镜像源来加快下载速度,所以这给小白带来了很大的困扰!这里我将通过合理上网工具来直接下载源镜像. 注意:本次教程适用于 ...

  4. 对javascript中call()方法的理解

    call ( thisObj [, arg1 [, arg2 [,  [, argN] ] ] ]) call()方法:官方介绍是,调用一个对象的一个方法,以另一个对象替换当前对象. call()方法 ...

  5. S02_CH12_ AXI_Lite 总线详解

    S02_CH12_ AXI_Lite 总线详解 12.1前言 ZYNQ拥有ARM+FPGA这个神奇的架构,那么ARM和FPGA究竟是如何进行通信的呢?本章通过剖析AXI总线源码,来一探其中的秘密. 1 ...

  6. ZYNQ笔记(1):PL端——led灯

    ZYNQ分为PS和PL,此博客实际上是FPGA中一个完整的FPGA工程的创建. PS:处理系统 (Processing System) 即ARM的Soc部分 PL:可编程逻辑(Programable ...

  7. mpx小程序框架

    在构建自己mpx小程序demo的时候遇到的问题 1.关于自定义tabbar的问题 1.1 在根据微信小程序的自定义tabbar来做 ▲在与src同级目录创建 custom-tab-bar 文件夹 创建 ...

  8. opentsdb操作草稿

    插入数据api/put 192.168.1.68:4242/api/put?details http://localhost:4242/api/put?detailsmethod:POST[ { &q ...

  9. angular复习笔记4-模板

    Angular复习笔记4-模板 简介 模板是一种自定义的标准化页面,通过模板和模板中的数据结合,可以生成各种各样的网页.在Angular中,模板的默认语言是HTML,几乎所有的HTML语法在模板中都是 ...

  10. K8S使用问题汇总

    1,报错如下 Warning: kubectl apply should be used on resource created by either kubectl create --save-con ...