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

news2024/11/24 14:41:56

目录

将图片到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静态页面引用查看

访问结果 


源码等资料获取方法

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

What Is the Character Limit for ChatGPT? 聊天GPT的字符限制是多少?

The character limit for ChatGPT text prompts is 4096 characters, and there’s also a limit of 4096 tokens per conversation. If you aren’t sure how many tokens your prompt uses, you can calculate that with OpenAI’s Tokenizer tool. ChatGPT 文本提示的字符限…

AutoHand第三人称的AutoHandVRIK开启和关闭

第三人称结构 第三人称在AutoHandVRIK脚本初始化完毕后,会出把两只手提到玩家对象根部对象上,并且在原始的模型手的位置创建了新的对象(leftHandFollowTarget,rightHandFollowTarget),副VRIK大概用途就是I…

从字母百分比看字符串处理的奥妙

本篇博客会讲解力扣“2278. 字母在字符串中的百分比”的解题思路,这是题目链接。 本题的思路是,统计字符letter在字符串s中出现的次数cnt,以及字符串s的长度n,其中n也可以使用strlen来求。最终要求计算的百分比是cnt*100/n。 int…

性能测试工具LoadRunne函数如何使用详解(上)

性能测试工具LoadRunner是软件测试行业主流测试工具,也是软件测试实验室在申请CNAS/CMA资质、测试质量体系建设一定会用到的一款软件测试工具。LoadRunner的函数是是组成测试脚本的最小单元,它真实模拟 一个个请求操作,并接收返回结果。学习L…

王道考研数据结构——顺序表

08 线性表的基本概念 对参数的修改结果需要“带回来”就使用引用类型的参数 顺序表的定义: 顺序存储、链式存储 sizeof(int)、sizeof(MyStruct) 顺序表的扩展 虽然大小改变,但是时间开销大 让代码健壮:对数据操作的合法性进行检查&#xf…

How to Write and Publish a Scientific Paper-How to Prepare Effective Graphs

How to Prepare Effective Graphs WHEN NOT TO USE GRAPHS 在上一章中,我们讨论了某些不应该制成表格的数据类型。它们也不应该被转换成图表。基本上,图表都是图形表格。 要点是这样的。某些类型的数据,特别是稀疏类型或单调重复的类型&am…

细节决定成败,聊聊JS的类型(下)

讲完了基本类型,我们来介绍一个现象:类型转换。 因为 JS 是弱类型语言,所以类型转换发生非常频繁,大部分我们熟悉的运算都会先进行类型转换。大部分类型转换符合人类的直觉,但是如果我们不去理解类型转换的严格定义&a…

牛客练习赛113

A小红的基环树 题目描述 定义基环树为n个节点、n条边的、没有自环和重边的无向连通图。 定义一个图的直径是任意两点最短路的最大值。 小红想知道,n个节点构成的所有基环树中,最小的直径是多少? 思路分析 特判n3时为1,其他时候都…

行业追踪,2023-07-11,新增加 rps50 排名,汽车零部件回落 10 日均线,直接反弹

自动复盘 2023-07-11 成交额超过 100 亿 排名靠前,macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类,这样更能体现主流方向 rps 有时候比较滞后,但不少是欲杨先抑, 应该持续跟踪,等 macd 反转时参与…

Stable Diffusion - 提示词翻译插件 sd-webui-prompt-all-in-one

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131649921 sd-webui-prompt-all-in-one 是一个基于 stable-diffusion-webui 的扩展,目的是提高 提示词/反向提示词 输入框的使用体验&…

汽车应用级MS35774/MS35774A低噪声 256 细分微步进电机驱动

MS35774/MS35774A 是一款高精度、低噪声的两相步进 电机驱动芯片,芯片内置功率MOSFET ,长时间工作的平均电 流可以达到 1.4A ,峰值电流 2A 。芯片集成了过温保护、欠压 保护、过流保护、短地保护、短电源保护功能。 主要特点 ◼ 2 相步进…

【python】Excel文件的插入操作

上篇文章写了pandas读取Excel文件的操作,但实际应用中,我们还需要对Excel指定单元格进行写入操作。 pandas模块写入 pandas模块方法写入,简单粗暴,就是把整个Excel文件重写 import pandas as pdfile_path 测试用例.xlsx # 读取Ex…

【Java基础】符号位、原码、补码、反码、位逻辑运算符、位移运算符、复合位赋值运算符

文章目录 前言&#xff1a;符号位、原码、补码、反码1.是什么2.各种码转换 一.二进制高低位1.1.什么是高低位1.2.高低位交换 二.位逻辑运算符位与运算 &位或运算 |异或运算 ^取反运算 ~ 三.位移运算符左位移运算符 <<右位移运算符 >>1.正数右移&#xff1a;2.负…

什么是QPS,什么是RT

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;什么是QPS&#xff0c;什么是RT ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加…

生产慢查询问题分析

1.问题描述 7月1日零点set_24出现大量慢查询告警&#xff0c;经DBA定位为子系统涉及的一条查询语句出现慢查询&#xff0c;引起set_24的cpu使用率突增&#xff0c;触发大量告警&#xff0c;查看生产执行计划发现慢查询为索引跳变引起&#xff1b;具体出现问题的sql语句如下&am…

【裸机开发】I2C 通信接口(三)—— I2C 底层驱动接口实现

目录 一、I2C 初始化 二、产生开始 / 停止信号 1、开始信号 2、重复开始信号 3、停止信号 三、向总线上发送数据&#xff08;阻塞模式&#xff09; 四、从总线上读取数据&#xff08;阻塞模式&#xff09; 五、整合&#xff1a;数据读写统一调用接口 一、I2C 初始化 初…

springboot驾校管理系统

框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 …

springboot+dynamic-datasource实现多数据源动态切换,非@DS注解方式

springbootdynamic-datasource实现多数据源动态切换&#xff0c;非注解 一、前言二、方案思路三、代码实现 一、前言 最近在分析SaaS平台多租户的功能&#xff0c;必然涉及数据库部分的功能&#xff0c;多租户的设计方案要考虑租户隔离数据和租户共享数据&#xff0c;共享数据…

concrt140.dll怎么修复?哪种修复方法更值得推荐

运行软件的时候&#xff0c;计算提示找不到concrt140.dll&#xff0c;第一次遇到的小伙伴肯定不知道是什么意思。concrt140.dll是Microsoft Visual C Redistributable for Visual Studio 2015的一部分。它是一个动态链接库文件&#xff0c;包含在Windows操作系统中。这个文件主…

【Python】瓶装液位检测系统

文章目录 概要效果图整体架构流程技术细节 概要 本代码是一个简单的GUI应用程序&#xff0c;用于瓶装液位检测系统。 效果图 整体架构流程 整体架构流程如下&#xff1a; 创建GUI窗口和必要的部件&#xff1a; 创建一个主窗口&#xff08;root&#xff09;作为GUI应用程序的…