Django如何实现文件上传下载
Django如何实现文件上传下载
小编给大家分享一下Django如何实现文件上传下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1. 前言
文件上传、下载作为基础功能,在 Web 项目中非常普遍,Django 项目如何实现文件上传下载?
2. 实战一下
2-1 进入虚拟环境,创建一个项目及 App
workondjango3#创建项目django-adminstartprojectfile_up_and_down_demo#进入项目根目录cdfile_up_and_down_demo/#创建一个Appdjango-adminstartappindex
2-2创建模板目录并配置 settings.py
在 index App 下创建一个 templates 文件夹,然后在项目配置文件 settings.py 中配置 App 及模板目录
#settings.py#配置AppINSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','index',]TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[#配置模板目录os.path.join(BASE_DIR,'index/templates')],'APP_DIRS':True,'OPTIONS':{'context_processors':['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]
2-3 创建文件模型,并映射到数据库
以默认的 sqlite 为例,在 index App 下的 models.py 中自定义一个代表文件的模型
该模型包含 3 个字段:
文件名称
文件保存路径
上传时间
#indexAppmodels.pyfromdjango.dbimportmodelsfromdjango.utilsimporttimezone#文件模型classFileModel(models.Model):#文件名称name=models.CharField(max_length=50)#文件保存路径path=models.CharField(max_length=100)#上传时间upload_time=models.DateTimeField(default=timezone.now)
然后,在项目根目录下执行下面 2 条命令,将模型结构映射到数据库中
#数据库映射Python3manage.pymakemigrationspython3manage.pymigrate
2-4自定义表单控件
在 index App 下创建一个表单文件 forms.py
在内部自定义一个表单类,继承于forms.Form
#indexAppforms.pyfromdjangoimportformsclassFileForm(forms.Form):file=forms.FileField(#支持多文件上传widget=forms.ClearableFileInput(attrs={'multiple':True}),label='请选择文件',)
2-5 添加上传、下载路由 URL
为上传、下载功能添加路由 URL
#项目urls.pyfromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('',include('index.urls'))]#indexAppurls.pyfromdjango.urlsimportpathfrom.viewsimport*urlpatterns=[#上传path('',index_view,name='index'),#下载path('download/<id>',download_view,name='download')]
2-6 编写模板文件
在 index App 的模板文件夹创建一个简单的模板文件upload.html
其中
form 代表视图函数传过来的表单实体对象
form.as_p 代表以字段格式渲染所有的表单元素
#indexAppupload.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>主页-上传文件</title></head><body><formmethod="post"enctype="multipart/form-data">{%csrf_token%}{{form.as_p}}<inputtype="submit"value="确定上传"></form></body></html>
2-7 上传视图函数
在 index App 下的 views.py 中编写上传功能的视图函数
需要注意的是,我们需要提前在项目根目录创建一个 upload 文件夹,用于存放上传的文件
#indexAppviews.pydefindex_view(request):"""上传文件:paramrequest::return:"""ifrequest.method=='POST':form=FileForm(request.POST,request.FILES)ifform.is_valid():#选择的文件files=request.FILES.getlist('file')#遍历写入到数据库中forfileinfiles:#写入到数据库中file_model=FileModel(name=file.name,path=os.path.join('./upload',file.name))file_model.save()#写入到服务器本地destination=open(os.path.join("./upload",file.name),'wb+')forchunkinfile.chunks():destination.write(chunk)destination.close()#提示上传成功returnHttpResponse('上传成功!')else:form=FileForm()returnrender(request,'upload.html',locals())
2-8 下载视图函数
接着,编写下载功能的视图函数
#indexAppviews.pydefdownload_view(request,id):"""下载文件:paramrequest::paramid:文件id:return:"""file_result=FileModel.objects.filter(id=id)#如果文件存在,就下载文件iffile_result:file=list(file_result)[0]#文件名称及路径name=file.namepath=file.path#读取文件file=open(path,'rb')response=FileResponse(file)#使用urlquote对文件名称进行编码response['Content-Disposition']='attachment;filename="%s"'%urlquote(name)returnresponseelse:returnHttpResponse('文件不存在!')
2-9 运行并测试
运行项目,访问下面的地址,并上传一个文件
使用 Pycharm 打开 sqlite 数据库,发现成功插入一条文件记录,并且文件也上传到 upload 文件夹下
接着访问下面的地址实现文件下载功能「 其中,file_id 代表文件的 id 值 」
http://127.0.0.1:8000/download/file_id
以上是“Django如何实现文件上传下载”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!