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判断字符串是否纯数字的方法
Nov 19 Python
python3中int(整型)的使用教程
Mar 23 Python
python对DICOM图像的读取方法详解
Jul 17 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
Python数据结构之单链表详解
Sep 12 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
Python日志无延迟实时写入的示例
Jul 11 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
利用python生成照片墙的示例代码
Apr 09 Python
python小白切忌乱用表达式
May 29 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 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使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
webpack多页面开发实践
2017/12/18 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python解决网站的反爬虫策略总结
2016/10/26 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
pycham查看程序执行的时间方法
2018/11/29 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
函数指针的定义是什么
2016/08/14 面试题
工作建议书范文
2014/05/13 职场文书
会计求职信范文
2014/05/24 职场文书
委托书的写法
2014/09/16 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
军训通讯稿范文
2015/07/18 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL