掌握Django文件处理:一步步构建上传功能

news2024/11/17 3:26:11

创建模型

首先先进入我们的testsite项目下,打开members/models.py文件,先添加我们保存文件的数据模型:

class Document(models.Model):
    name = models.CharField(max_length=255)
    file = models.FileField(upload_to='uploads/')  # 'uploads/' 是文件上传的相对路径
    uploaded_at = models.DateTimeField(auto_now_add=True)

这里的文件存储目录可以自定义我们需要存储文件的目录,也可以在我们的 env文件 做配置,这里直接读取相应的配置 env字段 就可以了。

进入testsite根目录执行更新迁移文件命令,这一步前面有说到,是为了更新迁移文件,

py manage.py makemigrations

可以看到我们的migrations目录增加了新的迁移文件

执行迁移

py manage.py migrate

我们新增加的文件模型表就在数据库生成好了。

使用模型

进入testsite/members目录,新增form.py表单文件,这里会定义文件上传的字段。

from django import forms
from .models import Document

class UploadFileForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ['name', 'file']  # 包含你想要用户填写的字段

接下来将上传的文件绑定到表单中,打开testsite/members/views.py视图文件:

from .forms import UploadFileForm #需要我们引入上一步建立好的表单文件

def upload_file(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()  # 保存表单数据到数据库
            return HttpResponse("上传成功")
    else:
        form = UploadFileForm()
    return render(request, "polls/upload.html", {"form": form})

我们传递request.FILES 到表单的构造函数;这就是文件数据绑定到表单的方式。

请注意,request.FILES仅当请求方法为POST,实际发送了至少一个文件字段且<form>表单有发送请求的并且具有enctype="multipart/form-data"属性时。否则request.FILES将为空。

最后一步,添加上传页面,进入members/templates/members目录,新增upload.html文件,注意跟我们的视图里面指向的文件名保持一致。

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

打开地址http://127.0.0.1:8000/polls/upload/进入文件上传页面

点写完表单点击提交

这个时候我们的文件上传就完成了,可以打开我们的testsite目录,进入我们设置的uploads目录,就看到我们上传好的文件:
在这里插入图片描述
然后我们再打开数据库,进入模型对应的members_document表,也可以看到文件上传生成的数据。
在这里插入图片描述

批量上传

为了使用一个表单字段上传多个文件,创建该字段的子类并将其allow_multiple_selected类属性设置为True

进入表单文件forms.py

class MultipleFileInput(forms.ClearableFileInput):
    allow_multiple_selected = True

class MultipleFileField(forms.FileField):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault("widget", MultipleFileInput())
        super().__init__(*args, **kwargs)

    def clean(self, data, initial=None):
        single_file_clean = super().clean
        if isinstance(data, (list, tuple)):
            result = [single_file_clean(d, initial) for d in data]
        else:
            result = [single_file_clean(data, initial)]
        return result


class FileFieldForm(forms.Form):
    file_field = MultipleFileField()

然后进入view.py视图文件重写子类form_valid()的方法 FormView来处理多个文件上传:

from .forms import FileFieldForm  # 确保导入正确的表单定义
from .models import Document  # 引入Document模型
def batch_upload_view(request):
    if request.method == 'POST':
        form = FileFieldForm(request.POST, request.FILES)
        if form.is_valid():
            # 获取表单中title的值
            title = form.cleaned_data['title']
            # 处理文件上传
            for file in request.FILES.getlist('file_field'):
                document = Document(file=file, name=title)  # 假设title作为文件的名称或描述
                document.save()

        return HttpResponse("上传成功")
    else:
        # 请求方法为GET时,初始化表单
        form = FileFieldForm()

    return render(request, "polls/uploads.html", {"form": form})

假如你不想使用模型关联上传,则使用如下方式:

from django.core.files.storage import default_storage
#使用默认存储引擎保存文件
file_name = default_storage.save(file.name, file)

然后重新渲染我们的批量上传页面,跟我们的forms django表单关联

<form method="post" enctype="multipart/form-data"> <!-- enctype 必须为 multipart/form-data 以支持文件上传 -->
    {% csrf_token %} <!-- Django表单必须的安全令牌 -->
    {{ form.title }} 
    {{ form.file_field }} <!-- 渲染文件上传字段,MultipleFileField将会生成相应的input元素 -->

    <button type="submit">上传文件</button>
</form>

上面的 csrf_token django表单必须的安全令牌,form.file_field 也是我们form.py定义的批量上传字段。

打开members/urls.py,添加我们的路由

path('uploads/', views.batch_upload_view, name='upload'),

我们的批量上传功能就已经写好了,我们打开http://127.0.0.1:8000/polls/uploads/页面

填好表单,批量选择文件,点击上传,这里我只是演示,没有做页面渲染样式与字段验证,感兴趣的小伙伴可以加上自己喜欢的样式。


然后进入我们的数据库可以看到我们与上传模型的记录被添加

我们打开uploads目录,也可以看到我们上传好的文件。


需要注意的是在保存上传的文件之前,数据需要存储在某个地方。

默认情况下,如果上传的文件小于 2.5 MBdjango 会将上传的全部内容保存在内存中。

这意味着保存文件仅涉及从内存读取和写入磁盘,因此速度非常快。

但是,如果上传的文件太大,django 会将上传的文件写入存储在系统临时目录中的临时文件。

例如/tmp/tmpzfp6I6.upload。如果上传的文件足够大,您可以看到该文件的大小随着 django 将数据传输到磁盘而增长

总结

文件上传算是一种很常见的需求,几乎构建很多项目系统,以及插件都需要用到。

通过上面例子可以看到django通过forms表单的形式灵活定义文件上传的页面,字段,以及数据库存储。

在实际项目中我们还要考虑到安全性,包括检查文件大小(可通过FileFieldmax_length属性设置)、防止路径遍历攻击。

还需注意服务器端的验证,比如检查文件类型、内容安全等。

例子里面有提到,djangoFileSystemStorageDefaultStorage类提供了基本的文件存储管理。

自定义存储后端可以提供更多灵活性,如自定义文件命名规则、存储路径等,以避免文件名冲突和优化组织结构。

大量文件上传或下载也会影响应用性能。最好采用云存储服务、内容分发网络(CDN)、以及对静态和媒体文件的有效缓存策略,可以显著提升用户体验。

对于我们本地的存储策略,需要考虑上传文件的生命周期管理,包括旧文件的定期清理策略,以避免无限制增长占用存储空间。

– 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

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

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

相关文章

大模型基架:Transformer如何做优化?

大模型的基础模式是transformer&#xff0c;所以很多芯片都实现先专门的transformer引擎来加速模型训练或者推理。本文将拆解Transformer的算子组成&#xff0c;展开具体的数据流分析&#xff0c;结合不同的芯片架构实现&#xff0c;分析如何做性能优化。 Transformer结构 tr…

CTF本地靶场搭建——GZ:CTF安装

GZ:CTF 项目地址:https://gitcode.com/GZTimeWalker/GZCTF GZCTF 是一款开源的网络安全竞技平台&#xff0c;由开发者GZTimeWalker维护。该项目旨在提供一个环境&#xff0c;让网络安全爱好者和专业人士能够实践他们的技能&#xff0c;通过解决各种安全问题&#xff08;即“…

流量分析——一、蚁剑流量特征

君衍. 一、Webshell特征流量分析二、环境介绍三、使用Wireshark进行流量分析1、环境说明2、HTTP追踪流分析3、蚁剑请求体中代码块解读 四、使用BurpSurite进行流量分析1、环境配置2、抓包分析 六、总结 一、Webshell特征流量分析 对于重保、护网等攻防演练的防守方来说&#x…

Python03:python代码初体验2

1、变量命名规范 1&#xff09;字母&#xff08;Unicode字符&#xff09;、数字、下划线&#xff0c;不能使用特殊字符&#xff0c;数字不能开头 2&#xff09;变量名是区分大小写的&#xff08;大小写敏感&#xff0c;x和X是两个不同的变量名&#xff09; 3&#xff09;不能使…

D-Day 上海站回顾丨以科技赋能量化机构业务

5月31日下午&#xff0c;DolphinDB 携手光大证券&#xff0c;在上海成功举办 D-Day 行业交流会。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场&#xff0c;深入交流量化投研交易过程中的经验、挑战及解决方案。 DolphinDB 赋能机构业务平台 来自光…

【一百】【算法分析与设计】N皇后问题常规解法+位运算解法

N皇后问题 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给出一个nnn\times nnn的国际象棋棋盘&#xff0c;你需要在棋盘中摆放nnn个皇后&#xff0c;使得任意两个皇后之间不能互相攻击。具体来说&#xff0c;不能存在两个皇后位于同…

K8s Pod的QoS类

文章目录 OverviewPod的QoS分类Guaranteed1.如何将 Pod 设置为保证Guaranteed2. Kubernetes 调度器如何管理Guaranteed类的Pod Burstable1. 如何将 Pod 设置为Burstable2.b. Kubernetes 调度程序如何管理 Burstable Pod BestEffort1. 如何将 Pod 设置为 BestEffort2. Kubernete…

Docker 进入指定容器内部(以Mysql为例)

文章目录 一、启动容器二、查看容器是否启动三、进入容器内部 一、启动容器 这个就不多说了 直接docker run… 二、查看容器是否启动 查看正在运行的容器 docker ps查看所有的容器 docker ps -a结果如下图所示&#xff1a; 三、进入容器内部 通过CONTAINER ID进入到容器…

x86国产化麒麟系统上安装docker及问题解决

以前感觉安装docker没有问题&#xff0c;所以没有记录怎么安装的&#xff0c;最近在国产化系统上安装docker总是失败&#xff0c;经过仔细研究完全解决了该问题&#xff0c;特此记录。 参考链接&#xff1a; 在 OpenKylin 上安装 Docker 按照上面的链接可以知道整个docker安装…

足球俱乐部管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教练管理&#xff0c;用户管理&#xff0c;合同信息管理&#xff0c;赛事管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&#xff0c;赛事…

在k8s中部署Kafka高可用集群超详细讲解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《数据流专家&#xff1a;Kafka探索》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Kafka简介 2、为什么在Kubernetes中部署Kafka 二、…

Facebook的隐私保护挑战:用户数据安全的新时代

在全球范围内&#xff0c;Facebook已经成为了不可忽视的社交媒体巨头&#xff0c;它连接着超过20亿的活跃用户。然而&#xff0c;随着其影响力的不断扩大&#xff0c;关于用户隐私和数据安全的问题也愈加引人关注。本文将深入探讨Facebook面临的隐私保护挑战&#xff0c;以及它…

列存在 OceanBase 数据库架构中的应用与演进

OceanBase 4.3 版本上线了列存功能&#xff0c;以满足实时分析的需求。 本文作为《特性解读&#xff1a;列存技术》的后续&#xff0c;将详细阐述列存技术在OceanBase数据库架构中的应用、发展历程&#xff0c;以及未来的趋势。 一、前言 1970 年&#xff0c;关系模型之父 Co…

275 基于matlab的脉搏信号处理GUI界面编程

基于matlab的脉搏信号处理GUI界面编程&#xff0c;并实现滤波、去噪、实时回放、小波分析 计算脉率。采用低通滤波器&#xff0c;计算巴特沃斯数字滤波器的阶数N和截止频率Wn、使用coif4小波基计算信号的平稳小波分解完成降噪。程序已调通&#xff0c;可直接运行。 275 脉搏信号…

Ubuntu22.04之安装有道词典(二百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

SQL158 每类视频近一个月的转发量/率

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:20011NULL210220012021-10-01 10:00:002021-10-01 10:00:15001NULL310320012021-10-01 11:00:502021-10-01 11:01…

【golang学习之旅】Go中的cron定时任务

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using…

微处理器体系结构

1.冯诺依曼结构 传统计算机采用冯●诺依曼(Von Neumann)结构&#xff0c;也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 特征&#xff1a; 冯●诺依曼结构的计算机程序和数据共用一个存储空间&#xff0c;程序指令存储地址和数据…

SAP IQ03 Error IW351

今天在系统内碰到一个情况是IQ03 无法显示设备对象 报错为&#xff1a;IW 351 Equipment object status errors BS001 IW351 查阅资料后&#xff0c;note 1835087 提供了解决办法 1.SE38-->RISTEQ03 2.输入设备号&#xff0c;测试执行&#xff0c;确认无误后&#xff0…

8990890

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日