Django(part47)--文件上传(django 上传下载文件)

网友投稿 258 2022-08-31


Django(part47)--文件上传(django 上传下载文件)

学习笔记,仅供参考

文件上传

上传须知

文件上传必须为POST提交方式,在文件上传时,表单​​

​​中必须有带有​​enctype="multipart/form-data"​​ 参数,才会包含文件内容数据。在表单中,我们通常用​​​​标签上传文件,​​type="file"​​用于生产一个表单控件,而​​name="xxx"​​与服务器端相联系。

在服务器端,我们可以通过​​request.FILES['xxx']​​ 返回的文件流对象,拿到​​name="xxx"​​所对应的上传文件。若我们用变量名file接收​​request.FILES['xxx']​​,即​​file=request.FILES['xxx']​​ ,此时,file就会绑定一个文件流对象,我们可以通过​​file.name​​ 获取上传文件的文件名,通过​​file.file​​ 获取上传文件的字节流对象(相当于​​f=open("文件名", rb)​​中​​f​​获取的对象)。

如上传文件为图片类型,则可以定义成models.ImageField类型

​​image_file = models.ImageField(upload_to='images/')​​如果属性类型为ImageField需要安装Pilow,​​pip install Pillow​​

上传文件的表单书写方式

文件上传

上传文件


举个例子

现在,在这个例子中,我想实现文件的上传。

现在,我们在mywebsite_bookstore项目下的模板文件夹templates下创建一个upload.html文件:

上传文件

文件上传

在主视图模块views.py中添加一个视图函数:

def on_upload(request): if request.method == "GET": return render(request, "upload.html") elif request.method == "POST": file = request.FILES['myfile'] html = "上传的文件为:{}
文件名为{}".format(file, file.name) return HttpResponse(html)

注意,我们获取的file对象不在我的磁盘上,而在内存中。

在主urls.py模块中添加一个路由:

from django.urls import re_pathfrom django.contrib import adminfrom django.conf.urls import includefrom . import viewsurlpatterns = [ re_path(r'^admin/', admin.site.urls), re_path(r'^upload/$',views.on_upload),]

现在,我们向on_upload(request): if request.method == "GET": return render(request, "upload.html") elif request.method == "POST": file = request.FILES['myfile'] html = "上传的文件为:{}
文件名为{}".format(file, file.name) with open(r"F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_bookstore\static\image\\" + file.name, 'wb') as f: b = file.file.read() #读取缓存文件的内容 f.write(b) return HttpResponse(html)

注意,这里的文件保存路径为绝对路径。我们也可以通过​​BASE_DIR​​来写保存文件的绝对路径(BASE_DIR会告诉我们项目所在的绝对路径)。

要做这件事,我们就需要在settings.py中自定义一个文件保存路径:

#自定义变量UPLOAD_DIR用于绑定上传文件的保存路径UPLOAD_DIR = os.path.join(BASE_DIR, 'static/image')

在主views.py中导入当前项目的配置文件settings.py,并修改视图函数on_upload:

from django.conf import settingsimport osdef on_upload(request): if request.method == "GET": return render(request, "upload.html") elif request.method == "POST": file = request.FILES['myfile'] html = "上传的文件为:{}
文件名为{}".format(file, file.name) with open(os.path.join(settings.UPLOAD_DIR, file.name), 'wb') as f: b = file.file.read() f.write(b) return HttpResponse(html)

一般情况下,我们的数据库中不会保存文件本身,而只保存文件的一些信息(比如文件名和文件保存路径)。

我们向Well !


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java高级语法学习之反射详解
下一篇:Django(part46)--form表单验证(django form)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~