在生成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. C#设计模式(4)-抽象工厂模式

    引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...

  2. java初步—参数的值传递

    校招季,本人匆匆忙忙地参加各种宣讲会,几次笔试下来都遇到同一个题目,而且全都错在同一想法上,方知自己的基础实在不太牢固,因此特别写在博客上提醒自己要脚踏实地地学习!不多说了,题目如下: public ...

  3. 浅谈如何用Java操作MongoDB

    NoSQL数据库因其可扩展性使其变得越来越流行,利用NoSQL数据库可以给你带来更多的好处,MongoDB是一个用C++编写的可度可扩展性的开源NoSQL数据库.本文主要讲述如何使用Java操作Mon ...

  4. 使用CXF开发JAX-RS类型的WebService

    1.JAXRSServerFactoryBean编程方式 访问方式:http://localhost:8080/cxf_spring_rest_server/ws/rest/student/query ...

  5. Linux-使用patch命令给uboot打补丁(3)

    patch:修改文件,让用户对原文件打补丁 用法        patch -p[剥离层级]  <[补丁文件] 打补丁示例: u-boot-1.1.6_jz2440.patach补丁文件给u-b ...

  6. 操作系统:ucore的部分Bug&挑战练习

    ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...

  7. 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

    这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处 ...

  8. Windbg DUMP

    Windbg DUMP分析(原创汇总) 1. 引入篇 1.1 下载安装 1.2 调试器 1.3 操作界面2. 命令篇 2.1 按照来源划分 2.1.1 基本命令 2.1.2 元命令 2.1.3 扩展命 ...

  9. 转:【Java集合源码剖析】Java集合框架

    转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663   Java集合工具包位于Java.util包下,包含了很多常用的数据结构, ...

  10. 201521123074 《Java程序设计》第4周学习总结

    1.本周学习总结 这次用XMind画的图,果然比百度脑图好用一点. 2.书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 类注释 方 ...