博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django的form表单之文件上传
阅读量:5250 次
发布时间:2019-06-14

本文共 2382 字,大约阅读时间需要 7 分钟。

在生成input标签的时候可以指定input标签的类型为file类型

    
Title

{
{ error_message }}

{% csrf_token %}

此时,在网页上页示如下

1133627-20171006200828740-1741589799.png

如果网页上提交的是用户名和密码等,通过键值对发送到服务端。

一组键值代表一个标签及标签对应的值。

在网页上选择一张图片,并使用post方式提交,在服务端打印request.POST

def index(request):        if request.method=="POST":            print(request.POST)            return render(request,"index.html",locals())

打印的信息如下:

提交的文件名也在这个字典中,取出这个文件名

def index(request):        if request.method=="POST":            print(request.POST.get("up_file"))            print(type(request.POST.get("up_file")))            return render(request,"index.html",locals())

打印结果如下:

1.png

想取出的是上传的文件,然而取出来的却是上传的文件的文件名

由此可知,上传的文件没有跟form表单提交的数据在一起

因为上传的文件通常大小比较大,所以Django默认会把上传的文件放在一个具体的文件夹中

打印request.FILES的信息

def index(request):        if request.method=="POST":            print(request.POST.get("up_file"))            print(type(request.POST.get("up_file")))            print("files:",request.FILES)            return render(request,"index.html",locals())

打印结果如下

1.png
files:

request.FILES打印的结果是一个空的字典,问题出在上传文件的方式上

由于上传文件时在客户端与服务端传输的是二进制数据,与字符串数据不一样。

传输二进制数据,不管是在form表单,还是在Ajax中,都有自己的传输方式。

在form表单中,上传文件时要使用分片传输的方式。

修改index.html文件

    
Title

{
{ error_message }}

{% csrf_token %}

重新上传文件,在服务端打印信息如下

None
files:
]}>

根据打印结果,request.FILES中可以看到上传的文件

打印结果是一个字典类型,字典的键是form表单中定义的标签的name属性值,而其值是所上传的文件的对象

打印上传文件的对象

def index(request):    if request.method=="POST":        print("files:",request.FILES.get("up_file"))        print(type(request.FILES.get("up_file")))    return render(request,"index.html",locals())

打印结果

files: 1.png

结果显示所取得的文件的类型是一个在内存中的上传文件

获取上传文件在内存中的名字

def index(request):    if request.method=="POST":        print(type(request.FILES.get("up_file")))        file_obj=request.FILES.get("up_file")        print(file_obj.name)    return render(request,"index.html",locals())

打印结果如下

1.png

既然知道了文件在内存中的名字,就可以在服务端写入这个文件

def index(request):    if request.method=="POST":        file_obj=request.FILES.get("up_file")        f1=open(file_obj.name,"wb")        for i in file_obj.chunks():            f1.write(i)        f1.close()    return render(request,"index.html",locals())

再次选择上传文件,提交后,就可以在服务端后台看到所上传的文件

可以在settings.py文件中设定上传文件的路径,或者在打开文件句柄的时候进行路径拼接来把上传的文件保存在指定的目录下

转载于:https://www.cnblogs.com/renpingsheng/p/7632596.html

你可能感兴趣的文章
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
【原创】Maven安装和配置
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
UESTC 1330 柱爷与远古法阵【高斯消元】
查看>>
前端非对称加密,后端Node.js解密(jsencrypt插件)(不需要密钥转码)
查看>>
趣谈Java变量的可见性问题
查看>>
图标字体制作 -- 将SVG制作成图标字体文件,通过引入使用
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
使用AVCaptureSession捕捉静态图片
查看>>
bugku web 头等舱
查看>>
Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse三者之间的区别
查看>>
算法之【仿竖式算法】
查看>>
java string
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>