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

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>{{ error_message }}</h4>
<form action="/index/" method="post">
{% csrf_token %}
<p><input type="file" name="up_file"></p>
<input type="submit">
</form>
</body>
</html>

此时,在网页上页示如下

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

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

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

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

打印的信息如下:

<QueryDict: {'csrfmiddlewaretoken': ['opmSmENIrgdGJJN'], 'up_file': ['1.png']}>

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

    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
<class 'str'>

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

由此可知,上传的文件没有跟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
<class 'str'>
files: <MultiValueDict: {}>

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

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

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

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

修改index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h4>{{ error_message }}</h4>
<form action="/index/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p><input type="file" name="up_file"></p>
<input type="submit">
</form>
</body>
</html>

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

None
<class 'NoneType'>
files: <MultiValueDict: {'up_file': [<InMemoryUploadedFile: 1.png (image/png)>]}>

根据打印结果,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
<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

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

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

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())

打印结果如下

<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
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文件中设定上传文件的路径,或者在打开文件句柄的时候进行路径拼接来把上传的文件保存在指定的目录下

Django的form表单之文件上传的更多相关文章

  1. Ajax提交Form表单及文件上传

    刚刚申请下来的博客,写得第一篇.有点小激动,本人以前是一名工业3D设计师突然有些变故做上了JavaWeb开发: 前几天,发现了一些小问题.我在写后台管理页面时,需要上传一张图片.于是我就用很普通的Fo ...

  2. php+form表单的文件上传

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 2020最新Servlet+form表单实现文件上传(图片)

    servlet实现文件上传接受 这几天学了一点文件上传,有很多不会,在网查了许多博客,但是最新的没有,都比较久了 因为我是小白,版本更新了,以前的方法自己费了好久才弄懂,写个随笔方便以后查找 代码奉上 ...

  4. form表单多文件上传

    1.html/jsp主页 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  5. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  6. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  7. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. $_FILES参数详解及简单<form>表单无刷新上传文件

    $_FILES:经由 HTTP POST 文件上传而提交至脚本的变量,类似于旧数组$HTTP_POST_FILES 数组(依然有效,但反对使用)详细信息可参阅 POST方法上传 $_FILES数组内容 ...

  9. 通过Ajax提交form表单来提交上传文件

    Ajax 提交form方式可以将form表单序列化 然后将数据通过data提交至后台,例如: $.ajax({      url : "http://localhost:8080/" ...

随机推荐

  1. CAS 单点登陆

    一.Tomcat配置SSL 1. 生成 server key 以命令方式换到目录%TOMCAT_HOME%,在command命令行输入如下命令: keytool -genkey -alias tomc ...

  2. java 可重入读写锁 ReentrantReadWriteLock 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...

  3. window.onerror 应用实例

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp75   window.onerror = function(sMessa ...

  4. Spring AOP 通过order来指定顺序

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt398 Spring中的事务是通过aop来实现的,当我们自己写aop拦截的时候 ...

  5. linux系统下C语言调用lapack ,blas库

    在利用C语言编程,经常调用其他的软件包,其中lapack,blas库是最常用的两个库,这里讲下在linux系统下,C语言编程如何调用这两个库: 1.首先讲下blas库的调用,这里以两个向量内积函数为例 ...

  6. Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署

    写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...

  7. Linux运维:安装CentOS7.2-图解

    矮哥linux运维群: 93324526 笔者QQ:578843228 此篇博文针对最小化安装,和只有图解.有不懂地方,欢迎加群询问.

  8. base(function strchr)

    函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符.        所在库名: ...

  9. a链接易混淆与form表单简易验证用法详解

    链接可以说遍布互联网,比如你想提供一个可以跳转到百度首页的链接给网友,那么代码如下: <a href="http://www.baidu.com">百度一下,你就知道& ...

  10. 201521123062《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...