Django中的文件的上传的几种方式


Posted in Python onJuly 23, 2018

PS:这段时间有点不在状态,刚刚找回那个状态,那么我们继续曾经的梦想

今天我们来补充一下文件的上传的几种方式:

首先我们先补充的一个知识点:

一、请求头ContentType:

ContentType 指的是请求体的编码类型,常见的类型共有三种:

1、application/x-www-form-urlencoded

这应该是最常见的POST提交数据的方式。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

user=duoduo&age=22

2、multipart/form-data

这又是一个常见的POST数据提交的方式。我们使用表单上传文件时,必须让<form>表单的enctype 等于multipart/form-data

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="user"

duoduo
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以  --boundary-- 标示结束。关于 multipart/form-data 的详细定义,请前往  rfc1867 查看。

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 <form> 表单也 只支持这两种方式 (通过 <form> 元素的  enctype 属性指定,默认为  application/x-www-form-urlencoded 。其实  enctype 还支持  text/plain ,不过用得非常少)。

随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。

3 、application/json

application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。

二、基于form表单的文件上传

模块部分

<form action="" method="post" enctype="multipart/form-data">
   用户名 <input type="text" name="user">
   头像 <input type="file" name="avatar">
  <input type="submit">
</form>

视图部分

def index(request):
  print(request.body)  # 原始的请求体数据
  print(request.GET)  # GET请求数据
  print(request.POST)  # POST请求数据
  print(request.FILES) # 上传的文件数据


  return render(request,"index.html")

三、基于Ajax的文件上传

模块

<form>
   用户名 <input type="text" id="user">
   头像 <input type="file" id="avatar">
   <input type="button" id="ajax-submit" value="ajax-submit">
</form>

<script>

  $("#ajax-submit").click(function(){
    var formdata=new FormData();
    formdata.append("user",$("#user").val());
    formdata.append("avatar_img",$("#avatar")[0].files[0]);
    $.ajax({

      url:"",
      type:"post",
      data:formdata,
      processData: false ,  // 不处理数据
      contentType: false,  // 不设置内容类型

      success:function(data){
        console.log(data)
      }
    })

  })

</script>

视图

def index(request):

  if request.is_ajax():

    print(request.body)  # 原始的请求体数据
    print(request.GET)  # GET请求数据
    print(request.POST)  # POST请求数据
    print(request.FILES) # 上传的文件数据

    return HttpResponse("ok")


  return render(request,"index.html")

检查浏览器的请求头:

Content - Type : multipart / form - data; boundary = - - - - WebKitFormBoundaryaWl9k5ZMiTAzx3FT

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之大话题小函数(2)
Oct 10 Python
Python中optparse模块使用浅析
Jan 01 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
基于python中theano库的线性回归
Aug 31 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
Python实现不规则图形填充的思路
Feb 02 Python
linux 下selenium chrome使用详解
Apr 02 Python
Python常见反爬虫机制解决方案
Jun 01 Python
python怎么判断素数
Jul 01 Python
flask中的wtforms使用方法
Jul 21 #Python
详解flask表单提交的两种方式
Jul 21 #Python
python实现周期方波信号频谱图
Jul 21 #Python
Flask-Mail用法实例分析
Jul 21 #Python
python实现傅里叶级数展开的实现
Jul 21 #Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 #Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 #Python
You might like
PHP使用递归生成文章树
2015/04/21 PHP
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python使用递归的方式建立二叉树
2019/07/03 Python
如何用python批量调整视频声音
2020/12/22 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
优质服务口号
2014/06/11 职场文书
社团活动总结怎么写
2014/06/30 职场文书
业务员岗位职责范本
2015/04/03 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
2016年校长新年寄语
2015/08/17 职场文书
2016特色励志班级口号
2015/12/24 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
《春酒》教学反思
2016/02/22 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android