【Django】Django文件上传

news/2024/12/22 1:30:38/

文件上传

1 定义&场景

  • 定义:用户可以通过浏览器将图片等文件上传至网站。

  • 场景:

    • 用户上传头像。

    • 上传流程性的文档[pdf,txt等]

2 上传规范-前端[html]

  • 文件上传必须为POST提交方式

  • 表单 <form> 中文件上传时必须带有 enctype="multipart/form-data" 时才会包含文件内容数据。

  • 表单中用 <input type="file" name="xxx"> 标签上传文件。

3 上传规范-后端[Django]

  • 视图函数中,用request.FILES取文件框的内容

  • file=request.FILES['xxx']

说明:

  1. FILE的key对应页面中file框的name值。

  2. file绑定文件流对象。

  3. file.name文件名。

  4. file.file文件的字节流数据。

配置文件的访问路径和存储路径:

  • 在settings.py中设置MEDIA相关配置,Django把用户上传的文件统称为media资源,需要与静态资源static进行区分。

    # file:settings.py
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

    MEDIA_URL 和 MEDIA_ROOT 需要手动绑定。

    方法:主路由中添加路由。

    # 说明:等价于做了MEDIA_URL开头的路由,Django接到该特征请求后去MEDIA_ROOT路径查找资源
    from django.conf impot settings
    from django.conf.urls.static import static
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

文件写入方案1:传统的open方式

@csrf_exempt
def file_upload(request):if request.method == 'GET':return render(request, 'file_upload.html')elif request.method == 'POST':upload_file = request.FILES['myfile']print("上传的文件名是:", upload_file.name)file_path = os.path.join(settings.MEDIA_ROOT, upload_file.name)with open(file_path, 'wb') as f:data = upload_file.file.read()f.write(data)return HttpResponse("接收文件:" + upload_file.name + "成功")

文件写入方案2:ORM

# 字段名:FileField(upload='子目录名')
@csrf_exempt
def file_upload(request):if request.method == 'GET':return render(request, 'file_upload.html')elif request.method == 'POST':upload_title = request.POST['title']upload_file = request.FILES['myfile']Content.objects.create(desc=upload_title, myfile=upload_file)return HttpResponse("接收文件:" + upload_file.name + "成功")

文件上传代码测试:

  1. 配置上传文件的访问路径和存储路径。

    # settings.py
    # 存储的路由
    MEDIA_URL = '/media/'
    # 存储的位置
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

  2. 编写html静态文件。

    # apps/templates
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>文件上传</title>
    </head>
    <body><form action="/file/upload/" method="post" enctype="multipart/form-data">{% csrf_token %}<p><input type="text" name="title"></p><p><input type="file" name="myfile"></p><p><input type="submit" value="上传"></p></form>
    </body>
    </html>

  3. 编写model模型文件。

    from django.db import models
    ​
    # Create your models here.
    class Content(models.Model):"""文件存储对象"""title = models.CharField('文件名', max_length=11)#子目录的名称即为:upload_to所指定的字段picture = models.FileField('子目录名称', upload_to='picture')

  4. 编写view视图文件。

    port render
    from django.http import HttpResponse
    from .models import *
    # Create your views here.
    ​
    def file_upload(request):
    ​if request.method == 'GET':return render(request, 'file_upload.html')elif request.method == 'POST':title = request.POST['title']myfile = request.FILES['myfile']Content.objects.create(title=title, picture=myfile)return HttpResponse("文件上传成功")else:return HttpResponse("请求方法错误")

  5. 编写url路由文件。

    from django.urls import path, re_path
    from . import views
    urlpatterns = [path("upload/", views.file_upload, name="file_upload")
    ]

  6. 请求测试。

    文件上传成功。

    使用URL进行访问。


http://www.ppmy.cn/news/1350457.html

相关文章

Unity报错Currently selected scripting backend (IL2CPP) is not installed

目录 什么是il2cpp il2cpp换mono Unity打包报错Currently selected scripting backend (IL2CPP) is not installed 什么是il2cpp Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式。由于iOS AppStore…

C#,21根火柴棍问题(21 Matchticks Problem)的算法与源代码

一、21根火柴棍问题&#xff08;21 Matchticks Problem&#xff09; 21根火柴棍问题是西方经典游戏之一。 给定21根火柴&#xff0c;2个人A和B&#xff08;比如&#xff1a;分别是计算机和用户&#xff09;。 每个人一次可以挑选 1-- 4 根火柴。 被迫挑最后一根火柴的人输了…

jvm问题自查思路

本文聊一下最近处理了一些jvm的问题上&#xff0c;将这个排查和学习过程分享一下&#xff0c;看了很多资料&#xff0c;最终都会落地到几个工具的使用&#xff0c;本文主要是从文档学习、工具学习和第三方技术验证来打开认知和实践&#xff0c;希望有用。 一、文档 不仅知道了…

__main__.py的作用

像C或C、Java等程序都用一个main函数入口&#xff0c;这样一来这些程序都可以直接在命令行运行。 那么python的主函数入口在哪里呢&#xff1f; if __name__ "__main__":fun_call()这个函数就是python的主函数入口。那么当前的python文件就可以直接在命令行里直接…

闭环控制系统手自动策略(车辆定速巡航应用)

闭环控制系统的手自动策略并不会完全一样&#xff0c;不同的行业&#xff0c;基于不同的规范和安全考虑给出的手自动策略是不一样的&#xff0c;这里我们介绍汽车行业定速巡航应用。 PID闭环控制系统手自动切换的相关文章&#xff0c;还可以查看下面链接&#xff1a; 无扰切换…

LeetCode Python - 12. 整数转罗马数字

目录 题目答案运行结果 题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。1…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

libevent

一、libevent库的安装(ubuntu) root用户运行以下命令&#xff1a; apt-get install libevent-dev非root用户&#xff1a; sudo apt-get install libevent-dev编译命令 gcc 文件名 -o 文件名 -levent二、libevent-IO事件 步骤&#xff1a; 创建事件初始化事件集合初始化事…