【django学习-06】视图之HttpRequest上传文件

  • 文件上传功能是网站开发常见的功能之一,比如上传图片(用户头像或者身份证信息)。无论上传的文件是什么格式的,其上传原理都是将文件以二进制的数据格式读取并且写入网站指定文件夹。
  • 下面我们通过一个示例来讲述Django如何实现文件上传的功能。
#blog/urls.py
from django.urls import path,re_path,include
from blog import views

urlpatterns = [
    re_path('include/', views.include_ces),
    path('request_1/', views.request_ces),
    path('upload/', views.upload),
]

#views.py
def upload(req):
    if req.method == "POST":
        #获取上传的文件,如果没有则为None
        myFile = req.FILES.get("myfile",None)

        if not myFile:
            return HttpResponse("no files for upload!!")

        from pathlib import Path
        #将获取到的上传文件,保存到项目目录下
        BASE_DIR = Path(__file__).resolve().parent.parent
        dir_name = os.path.join(BASE_DIR,"upload")

        if not os.path.exists(dir_name):
            os.makedirs(dir_name)
        with open(os.path.join(dir_name,myFile.name),"wb+") as f:
            for chunk in myFile.chunks():
                f.write(chunk)
        return HttpResponse("upload over")

    return render(req,"upload.html")

#templates/upload.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form enctype="multipart/form-data" action="/blog/upload/" method="post">
    <input type="file" name="myfile">
    <br>
    <input type="submit" value="上传文件">

</form>

</body>
</html>
  • 原理说明

    • 1、模板文件upload.html使用form标签的文件控制file生成文件上传功能,该控件将用户上传的文件以二进制的读取,读取方式由form标签的enctype="multipart/form-data"设置;
    • 2、浏览器将用户上传的文件读取后,通过HTTP的POST请求将二进制数据传到Django,当Django收到POST请求后,从请求对象的属性FILES获取文件信息;
    • 3、从文件信息对象myFile.chunks()读取文件内容,并写入文件。
  • myFile提供了以下属性来获取文件信息

    • myFile.name:获取上传文件的文件名
    • myFile.siza:获取上传文件的文件大小
    • myFile.content_type:获取文件类型
    • myFile.read():从文件对象中读取整个文件上传的数据,这个方法只适合小文件
    • myFile.chunks():按流式响应方式获取数据,在for循环中进行迭代,将大文件分块写入服务器指定的保存路径
    • myFile.multiple_chunks():判断文件对象的文件大小,返回True或者False,当文件大于2.5MB(默认)时,返回True,否则返回False,因此可以根据该方法来选择使用read()还是采用chunks()。
  • 源码

    • 源码文件uploadedfile.py定义了4个类,每个类实现功能说明如下:
      • UploadedFile:文件上传的基本功能类,继承父类File,主要获取文件的文件名、大小和类型等基本信息;
      • TemporaryUploadedFile:将文件数据临时存放在服务器的指定文件里,适合大文件的上传;
      • InMemoryUploadedFile:将文件数据存放在服务器的内存里,适用于小文件上传;
      • SimpleUploadedFile:将文件的文件名、大小和类型生成字典格式。
    • Django在这4个功能类的基础上,进一步完善了文件上传处理过程、文件的创建、读写和关闭等,定义了7和Handler类和一个函数。
posted @ 2022-09-01 22:35  Tony_xiao  阅读(313)  评论(0编辑  收藏  举报