Django_自定义文件存储类并将图片上传到FastDFS

目录

将图片到FastDFS和浏览的流程图

使用自定义文件存储类

1、定义存储类

2、创建FastDFS的配置文件

3、修改settings.py配置

4、上传图片进行验证

4.1 定义一个包含ImageField字段的模型类

4.2 登录django的admin后台

4.3 上传图片

4.4 查看图片

源码等资料获取方法


先部署好FastDFS,这个以前我的文章有讲过,可以去找找看

将图片到FastDFS和浏览的流程图

使用自定义文件存储类

1、定义存储类

自定义django文件存储类需要继承django的Storage类,并重写_open、_save、url、exists方法

创建fdfs_storage.py文件

实现如下代码:

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from dailyfresh import settings


class FastDFSStorage(Storage):
    """FastDFS文件存储类"""

    def __init__(self, client_conf=None, nginx_url=None):
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.nginx_url = nginx_url or settings.NGINX_URL

    def _open(self, name, mode='rb'):
        """
        用于打开文件
        :param name: 要打开的文件的名字
        :param mode: 打开文件方式
        :return: None
        """
        # 打开文件时使用的,此时不需要,而文档告诉说明必须实现,所以pass
        pass

    def _save(self, name, content):
        """
        用于保存文件
        :param name: 要保存的文件名字
        :param content: 要保存的文件的内容
        :return: None
        """
        # 创建一个Fdfs_client对象, 需要client配置文件
        client = Fdfs_client(self.client_conf)

        # 上传文件到fastdfs系统中
        ret_dict = client.upload_by_buffer(content.read())
        # ret_dict返回的是一个字典,类型如下
        """
        {
            'Group name': 'group1',
            'Local file name': '02.png',
            'Remote file_id': 'group1/M00/00/00/wKgNgF9uzVuAd7JlAAS-_JN9ZAI299.png',
            'Status': 'Upload successed.',
            'Storage IP': '192.168.13.128',
            'Uploaded size': '303.00KB'
        }
        """
        if ret_dict.get("Status") != "Upload successed.":
            # 上传失败
            raise Exception("上传文件到fastdfs失败")

        # 获取返回的文件id
        file_id = ret_dict.get("Remote file_id")

        # 返回什么内容,最终在image属性对应的表中的字段保存的就是什么内容
        return file_id

    def url(self, name):
        """
        返回name所指文件的绝对URL
        :param name: 文件的id
        :return: 文件的url
        """
        # return 'http://ip:port/' + name
        return self.nginx_url + name

    def exists(self, name):
        """ Django判断文件名是否可用, 必须重写"""
        return False

2、创建FastDFS的配置文件

创建fdfs_client.conf文件

 内容如下:

connect_timeout=30
network_timeout=60
tracker_server=192.168.107.201:22122
http.tracker_server_port=8080

3、修改settings.py配置

在setting.py文件中添加如下配置

# 设置Django的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs_storage.FastDFSStorage'

# FastDFS配置文件路径
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, "./dailyfresh/fdfs_client.conf")

# 设置fdfs存储服务器上nginx的IP和端口号
NGINX_URL = 'http://192.168.107.201:8080/'

4、上传图片进行验证

4.1 定义一个包含ImageField字段的模型类

class GoodsType(BaseModel):
    '''商品类型模型类'''
    name = models.CharField(max_length=20, verbose_name='种类名称')
    logo = models.CharField(max_length=20, verbose_name='标识')
    image = models.ImageField(upload_to='type', verbose_name='商品类型图片')

    class Meta:
        db_table = 'df_goods_type'  # 数据库表格名称
        verbose_name = '商品种类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

在该模型类所属应用的admin.py中注册该模型类

4.2 登录django的admin后台

创建django的admin后台管理账号

python manage.py createsuperuser

在浏览器中输入 127.0.0.1/admin,输入上面创建的账号和密码进入admin管理后台

4.3 上传图片

点击增加

 完善信息后,点击保存

 保存成功后,进入详情界面,可以看到上传图片在FastDFS中保存的id

4.4 查看图片

不能使用“nginx地址+图片id”直接查看图片,需要在html静态页面引用查看

访问结果 


源码等资料获取方法

 各位想获取源码的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/37708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中,网络抖动和延迟是常见的问题,会导致音视频质量下降和用户体验不佳。为了解决这些问题,WebRTC引入了Jitter Buffer(抖动缓冲区)这一重要组件。Jitter Buffer是一个缓冲区,用于接收和处理网络…

树与图的(深度 + 广度)优先遍历

目录 一、树与图的存储1.树的特性2.图的分类3.有向图的储存结构 二、树与图的深度优先遍历的运用树的重心题意分析代码实现 三、树与图的广度优先遍历的运用图中点的层次题意分析代码实现 一、树与图的存储 1.树的特性 树是一种特殊的图,具有以下两个重要特性: 无环 树是一个…

7.Java 运算符

运算符分成以下几组 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 1.算术运算符 public class Test {public static void main(String[] args) {int a 10;int b 20;int c 25;int d 25;System.out.println("a b " (a b) );System.out.print…

奥威BI-金蝶云星空SaaS版一站式平台:对接数据、做分析

金蝶云星空和BI大数据分析平台都在企业数字化转型中扮演了重要的角色,为企业提供了全面的数字化解决方案和数据分析功能,两者强强联合不仅能提高部署效率,更能增强数据分析、数据可视化效果,帮助企业更好地适应市场变化和用户需求…

基于SSM的新生报到系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Interactive Image Segmentation

Focused and Collaborative Feedback Integration for Interactive Image Segmentation CVPR 2023 清华 Interactive image segmentation aims at obtaining a segmentation mask for an image using simple user annotations. During each round of interaction, the segment…

科技资讯|苹果Vision Pro预计2024年末全球发售

据彭博社记者古尔曼消息,苹果首款头显Vision Pro计划于2024年初在美国市场指定店铺进行开售,这些商店将会有专属区域用于产品演示,配备座位、配件和测量尺寸的工具等。知情人士透露,将有270家美国的苹果商店会销售Vision Pro&…

基于JSP+Servlet的医药药品管理系统

用户类型:双角色角色(患者、管理员[医生]) 设计模式:MVC(jspservletjavabean) 项目架构:B/S架构 开发语言:Java语言 主要技术:jsp、servlet、jdbc、jsp、html5、jquery、css、js…

小程序项目时间选择器用法

项目需求是要实现这种形式, 但是相信大家都试了各种插件,都不太合适,uView框架也不能满足自己的需要; 推荐使用:uview-ui-plus 基本上小程序遇到的单选多选 日期 省市区 都可以完美的实现,可以通过插件市场安装使用 但是要实现ui给的原型图 还需要做一下调整 弹性布局给两个选…

【Linux】1、装机、装操作系统、部署

文章目录 一、装系统1.0 格式化 U 盘1.1 做启动盘1.1.2 rufus1.1.2 poweriso 1.2 安装步骤 二、恢复系统2.1 BootManager2.2 recovery mode 一、装系统 下载地址: http://old-releases.ubuntu.com/releases/16.04.5/ubuntu-16.04.5-server-amd64.isohttps://mirro…

C#内存不够解决方法

今天在使用C#程序的时候,出现了下图的问题: 注意下图中我用红框标出的位置,实际是一个三维数组。 但是出现这个问题和三维数组没有关系。 他是提示内存不足。 百度了一下,C#在生成的过程中如果是生成对应的32位系统&#xff0c…

C国演义 [第九章]

第九章 买卖股票的最佳时机III题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机IV题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机III 力扣链接 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格 设计一个算法…

制作Visual Studio离线安装包

vs2015之后官网就不提供离线安装包了,使用离线安装包就需要自己手动制作一个; 以vs2019为例: 先去官网下载在线安装器 官网下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 展开2019的标签…

2023.7.15

同余最短路 P3403 跳楼机 题意:给定h高的楼层,起始位置在第一层,可以选择操作向上移动x层或y层或z层,回到第一层 求可以到达的楼层数 思路:转化题意为求axbyczk(k在[1,h],x,y,z为正整数,有多少k满足条件&am…

推荐一款IDEA神级插件【Bito】而且免费!

什么是Bito? Bito是一款在IntelliJ IDEA编辑器中的插件,Bito插件是由ChatGPT团队开发的,它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队,他们开发了一款基于GPT的自然语言处理…

动态规划之118杨辉三角(第6道)

题目:给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 题目链接:118. 杨辉三角 - 力扣(LeetCode) 示例: 解法&#xff1…

C/C++实现高并发http服务器

http高并发服务器实现 基础知识 html,全称为html markup language,超文本标记语言。 http,全称hyper text transfer protocol,超文本传输协议。用于从万维网(WWW:World Wide Web)服务器传输超…

异地使用PLSQL远程连接访问Oracle数据库【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 转载自cpolar极点云文章:公网远程连接…

Jenkins的几种安装方式以及邮件配置

目录 Jenkins介绍 Jenkins下载、安装 一、通过war包安装 二、通过docker安装 jenkins 容器中添加 git, maven 等组件 jenkins 容器中的公钥私钥 在 jenkins 容器中调用 docker 简单的方式启动 Docker server REST API 一个 jenkins 示例 三、通过Homebrew安装 访问Je…

【DC-DC】AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式,高效率、外围简单、内置功率MOS管,适用于4.5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.5A。AP5193可实现线性调光和PWM调光,线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&…