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如何实现文件上传下载”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-03 21:23:00
收藏
分享
海报
0 条评论
32
上一篇:springboot集成cas5.3如何实现sso单点登录 下一篇:dao等bean(SpringBoot如何实现其他普通类调用Spring管理的Service)
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码