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查询Mysql时返回字典结构的代码
Jun 18 Python
python的三目运算符和not in运算符使用示例
Mar 03 Python
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
python中pivot()函数基础知识点
Jan 03 Python
Python 绘制多因子柱状图
May 11 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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
PHP中echo和print的区别
2014/08/28 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
清除js缓存的多种方法总结
2016/12/09 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
用Python写冒泡排序代码
2016/04/12 Python
Python实现堆排序的方法详解
2016/05/03 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python中断多重循环的思路总结
2019/10/04 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
墨西哥网上超市:Superama
2018/07/10 全球购物
外贸业务员的岗位职责
2013/11/23 职场文书
电教室标语
2014/06/20 职场文书
婚庆公司计划书
2014/09/15 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
上班旷工检讨书
2015/08/15 职场文书
小学生安全教育心得体会
2016/01/15 职场文书