django 实现文件上传功能
文件上传原理是无论上传的文件格式是什么,将文件以二进制的数据格式读取并写入网站指定的文件里。
在myApp下配置urls.py路由:
#myApp urls.py from argparse import Namespace from operator import index from django.urls import path,re_path,include from . import views from django.views.generic import RedirectView urlpatterns = [ path("",views.index,name="index"), path("download/file1",views.download1,name="download1"), path("download/file2",views.download2,name="download2"), path("download/file3",views.download3,name="download3"), path("upload",views.upload,name="uploaded") ] #配置全局404页面 handler404 = "myApp.views.page_not_found" #配置全局500页面 handler500 = "myApp.views.page_error"
在myApp应用的视图中,实现文件上传的功能:
from django.shortcuts import render from django.http import HttpResponse import os # Create your views here. def index(request): # return redirect("index:shop",permanent=True) return render(request,"index.html") def upload(request): #请求方法为POST时,执行文件上传 print("debug ++++++++++++++++++++++++") print(request.method) if request.method == "POST": #获取上传的文件,如果没有文件,就默认为None myFile = request.FILES.get("myfile",None) if not myFile: return HttpResponse("no files for upload") #打开特定的文件进行二进制的写操作 f = open(os.path.join("E:\myDjango\\file",myFile.name),"wb+") #分块写入文件 for chunk in myFile.chunks(): f.write(chunk) f.close() return HttpResponse("upload over!") else: #请求方法为get时,生成文件上传页面 return render(request,"index.html")
- 浏览器将用户上传的文件读取后,通过http的post请求将二进制数据传到django,当django收到post请求后,从请求对象的属性FILES获取文件信息,然后再D盘的upload文件夹里创建新的文件,文件名(从文件信息对象myFile.name属性获取),与用户上传的文件名相同。
- 从文件信息对象myFile.chunks()读取文件内容,并写入D盘的upload文件夹的文件中。
- myFile.name 获取上传文件的文件名,包含文件后缀名。
- myFile.size 获取上传文件的文件大小。
- myFile.content_type 获取文件类型,通过后缀名判断文件类型。
- myFile.read() 从文件对象里读取整个文件上传的数据,这个方法只适合小文件。
- myFile.chunks() 按流式响应方式读取文件,在for循环中进行迭代,将大文件分块写入服务器所指定的保存位置。
- myFile.multiple_chunks() 判断文件对象的文件大小,返回True或者False,当文件大于2.5MB时,该方法返回True,否则返回False,因此,可以根据该方法来选择选用read()方法读取还是采用chunks()方法读取
在index.html中,添加上传文件的控件:
<html> <header> <title>首页文件处理</title> </header> <body> <a href="{%url 'myApp:download1' %}">下载1</a> <a href="{%url 'myApp:download2' %}">下载2</a> <a href="{%url 'myApp:download3' %}">下载3</a> <form enctype="multipart/form-data" action="/upload" method="post"> <!-- django 的csrf 防御机制 --> {%csrf_token%} <input type="file" name="myfile" /> <br> <input type="submit" value="上传文件" /> </form> </body> </html>
在模板文件index.html使用form标签的文件控件file生成文件上传功能,该控件将用户上传的文件以二进制的形式读取,读取方式由form标签的属性entype=“multipart/form-data”设置