Django高级扩展之文件上传

news2024/10/6 22:20:27

文件上传是一个比较常用的网站功能,在服务器端,Django会使用一个叫作request.FILES的对象来处理上传的文件。

目录

存储路径

创建存储目录

配置settings.py

上传单文件

配置url

上传文件模板

视图方法

显示上传页面

上传文件处理

上传效果

1.选好上传文件

2.点击提交

3.查看上传文件

上传多文件

新建表单类

多文件上传视图

多文件上传路由

引入表单类

设置路由

上传效果

1.上传页面

2.选择多文件

3.查看选中文件

4.上传成功

总结


存储路径

创建存储目录

在static/应用目录下创建uploads目录用于存储接收上传的文件。

 

配置settings.py

上传文件目录

MEDIA_ROOT = os.path.join(BASE_DIR, 'static/myapp/uploads')

上传单文件

文件上传时,文件数据存储在request.FILES属性中。

注意:from表单上传文件需要加 enctype=”multipare/form-data”

上传必须是post请求。

配置url

path('upload_view', views.upload_view, name='upload_view'),
path('upload_save', views.upload_save, name='upload_save'),

上传文件模板

在应用模板目录下创建上传单一文件的模板。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传单文件</title>
</head>
<body>
<form action="{% url 'myapp:upload_save' %}" method="post" 
enctype="multipart/form-data">
    请选择文件:<input type="file" name="file">
    <br>
    {% csrf_token %}
    <input type="submit" value="提交">
</form>
</body>
</html>

视图方法

显示上传页面

def upload_view(request):

    return render(request, 'myapp/uploadOne.html')

上传文件处理

from django.conf import settings
def upload_save(request):
    """ 上传文件保存 """

    if request.method == 'POST':
        file = request.FILES['file']
        # 文件在服务端路径 获取配置

        filePath = os.path.join(settings.MEDIA_ROOT, file.name)
        # 保存文件
        with open(filePath, 'wb+') as fp:
            for info in file.chunks():
                fp.write(info)
        return HttpResponse('上传成功!')
    else:
        return HttpResponse('请选择POST提交文件!')

注意:为了避免read()方法一次性将文件读取到内存中造成内存不足的问题,使用f.chunks()方式将文件分块处理。

上传效果

1.选好上传文件

 

2.点击提交

 

 

3.查看上传文件

上传成功后,上传文件保存目录可见上传文件。

 

 

上传多文件

由于标准的HTML只允许使用<input type="file">进行文件上传,而<input type="file">每次只能上传一个文件,因此对于需要进行大量文件上传的操作来说会很不方便,这在Django中就变得相对简单很多。

新建表单类

在应用目录下新建文件forms.py,添加FileFieldForm表单类。

内容如下:

from django import forms

class FileFieldForm(forms.Form):
    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

多文件上传视图

在应用目录下新建form_view类,用作多文件上传视图处理。

内容如下:

import os
from django.conf import settings
from django.views.generic.edit import FormView
from .forms import FileFieldForm
from django.http import HttpResponse

class FileFieldView(FormView):
    form_class = FileFieldForm
    # 设置模板路径
    template_name = 'myapp/uploadMany.html'
    # 设置后跳转路径
    success_url = 'upload_success'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('file_field')
        if form.is_valid():
            for f in files:
                handle_uploaded_file(f)
            return self.form_valid(form)
        else:
            return self.form_valid(form)


def handle_uploaded_file(file):
    """ 文件保存处理 """
    filePath = os.path.join(settings.MEDIA_ROOT, file.name)
    # 保存文件
    with open(filePath, 'wb+') as fp:
        for info in file.chunks():
            fp.write(info)


def upload_success(request):
    """ 上传成功响应 """

    return HttpResponse('多文件上传成功!')

多文件上传路由

引入表单类

from . import form_view

设置路由

path('upload_many', form_view.FileFieldView.as_view(), name='upload_many'),
path('upload_success', form_view.upload_success, name='upload_success'),

上传效果

1.上传页面

 

2.选择多文件

按住ctrl点选多个文件,确定后点击打开。

 

3.查看选中文件

 

移动鼠标到7个文件处,可显示选中文件列表

 

 

4.上传成功

上传文件目录可见文件

 

 

总结

单文件上传很好实现,多文件就需要依赖很多类库来实现。

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

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

相关文章

盘点五种最常见加密算法!

大家好&#xff0c;我是Martin。 今天&#xff0c;就给大家来盘点一下最常见的5种加密算法。 大家平时的工作中&#xff0c;可能也在很多地方用到了加密、解密&#xff0c;比如&#xff1a; 用户的密码不能明文存储&#xff0c;要存储加密后的密文 用户的银行卡号、身份证号…

2024年天津农学院专升本专业课参考书目

天津农学院2024年高职升本科拟招生专业参考书目 天津农学院专升本专业课参考教材&#xff08;我校不提供专业课参考教材&#xff09; 人力资源管理专业参考教材&#xff1a; 1、《人力资源管理实用教程》 (第2版)&#xff0c;吴宝华&#xff0c;北京大学出版社 2、《人力资源…

运维(SRE)成长之路-第3天 文本处理三剑客之 grep

1.命令作用以及参数详解 grep: 全局搜索正则表达式并打印行(Global search REgular expression and Print out the line)作用&#xff1a;文本搜索工具&#xff0c;根据用户指定的“模式”对目标文本逐行进行匹配检查&#xff1b;打印匹配到的行模式&#xff1a;由正则表达式字…

GitHub Copilot 最全安装、使用

GitHub Copilot 最全安装、使用教程 一、温馨提示 GitHub Copilot 目前为止可以免费试用一个月&#xff0c;但是试用的前提是必须要绑定银行卡&#xff0c;因为后续会自动扣费&#xff0c;所以请注意试用结束日期&#xff0c;自己定好闹钟关闭订阅。 订阅价格为每月10美刀&a…

【Pinia 状态管理篇】Vite + Vue3 组合式 API 模式下的 Store 数据处理

文章目录 Pinia 状态管理一、 Pinia 安装与使用1.1 安装1.2 注册 pinia 实例到全局1.3 创建一个 Store1.4 组件内使用 Store 二、Pinia 核心概念展开学习Store 的定义和使用2.1 State2.2 Getter2.3 Action 附&#xff1a;1. 什么是魔法字符串&#xff1f; Pinia 状态管理 一、 …

Nacos配置中心使用(Spring Cloud版)

目标 向项目中集成Nacos配置。原项目是一个SpringBoot项目。这里假设我们无法修改原有项目的SpringBoot版本。 注意 在不动SpringBoot版本的前提下&#xff0c;根据SpringBoot的版本&#xff0c;确定Spring Cloud和Nacos版本。Nacos版本其实就是Spring Cloud Alibaba版本。在…

【Linux】网络结构模式

目录 网络结构模式C/S结构B/S结构 MAC地址IP地址端口网络模型OSI七层模型TCP/IP四层模型 通信过程数据包封装协议以太网协议ARP协议IP数据报格式UDP协议格式TCP协议格式封装分用TCP详解TCP和UDPTCP通信流程TCP三次握手 网络结构模式 C/S结构 客户机-服务器(client-server)结构…

uboot读取adc,通过cmdline传给kernel解析数值,不同硬件模块进行处理

uboot读取adc&#xff0c;通过cmdline传给kernel解析数值&#xff0c;不同硬件模块进行处理 uboot开发&#xff0c;要想读取adc在哪个时间点读取以及如何传给cmdline&#xff0c;需要清楚2点&#xff0c; uboot启动得大致流程及相关启动功能&#xff0c;uboot各个硬件模块得接…

主机安全各个方面应该怎么做?

主机安全是指保护主机系统不受恶意攻击和未经授权访问的威胁&#xff0c;以保证系统的稳定性、可用性和数据的安全性。 以下是主机安全涉及的几个方面做法&#xff1a; 1. 操作系统安全&#xff1a;安装操作系统时需要选择合适的版本&#xff0c;及时打补丁更新&#xff0c;配置…

入职Linux驱动工程师后,我才知道的真相…

大家好&#xff0c;我是ST。 做Linux驱动工程师也有一段时间了&#xff0c;今天分享一下我曾经入职才知道的一些事情&#xff0c;算是一个菜鸟的经历吧&#xff01; 设备树 起初学习Linux驱动&#xff0c;是从最简单的一个.c文件开始。 在.c中实现module_init和module_exit这…

大模型入门(三)—— 大模型的训练方法

参考hugging face的文档介绍&#xff1a;https://huggingface.co/docs/transformers/perf_train_gpu_many#naive-model-parallelism-vertical-and-pipeline-parallelism&#xff0c;以下介绍聚焦在pytorch的实现上。 随着现在的模型越来越大&#xff0c;训练数据越来越多时&…

基于Ubuntu22.10系统安装部署webmin软件

Webmin是一个用于Linux系统管理的开源的基于web的系统管理配置工具。有了这个工具的帮助&#xff0c;我们可以管理内部的系统配置&#xff0c;诸如设置用户账户&#xff0c;磁盘配额&#xff0c;像Apache, DNS, PHP, MySQL&#xff0c;文件共享的服务等。 本文描述在ubuntu22.…

VS+C#+WPF多线程视频摄像头播放器监控

程序示例精选 C#WPF多线程视频摄像头播放器监控 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C#WPF多线程视频摄像头播放器监控>>编写代码&#xff0c;代码整洁&#xff0c;规…

el-table点击单元格变成输入框,以及其自动获取焦点失效可能的原因(focus失效)

1.el-table点击单元格变成输入框 这里主要使用了el-table三个自带的方法/属性&#xff1a; <el-table:data"MesTableData"bordercell-click"clickCell":row-class-name"tableRowClassName":cell-class-name"tableCellClassName" …

解决elementUI弹出框关闭后再打开el-select下拉框无法选中的问题

文章目录 一、问题描述&#xff1a;二、问题解决 一、问题描述&#xff1a; 使用的前端UI框架为elementUI。 el-select组件在一个弹框中&#xff0c;打开该弹框&#xff0c;el-select可以正常选中&#xff0c;但是保存弹框中的表单信息关闭弹框后&#xff0c;再打开弹框&…

RT-DETR论文解读与代码

1.概述 目前以大名鼎鼎的YOLO为代表的基于CNN的实时监测网络需要NMS进行后处理&#xff0c;导致不能很好的优化网络&#xff0c;并且网络不够健壮&#xff0c;从而导致检测器的推理速度出现延迟。研究者也分析了Anchor-based和Anchor-free的YOLO的性能&#xff0c;发现Anchor并…

【Java基础篇】方法的使用(方法的重载和递归)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

打造智能生活方式

2个互联网工具与你分享 分享一&#xff1a; 随记单词是一款功能强大的单词记忆和管理应用程序。它为用户提供了便捷的学习工具和智能化的记忆方式&#xff0c;帮助用户轻松有效地记忆和掌握单词。 随记单词的特点之一是个性化记忆计划。用户可以根据自己的学习进度和需求&am…

如何使用MATLAB处理涡度通量数据

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&#x…

苹果头显Vision Pro深度解读3 苹果头显visonOS开发指南

1 程序员visonOS开发指南 作为iOS开发者&#xff0c;切换到visionOS开发非常简单啊&#xff0c;过去的一些技术基本上都用得上。目前根据苹果WWDC官方的文档&#xff0c;视频&#xff0c;我们可以知道: 开发语言&#xff0c;使用的是swift object-c c c等&#xff0c;swif…