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实现apahce网站日志分析示例
Apr 02 Python
python通过imaplib模块读取gmail里邮件的方法
May 08 Python
使用python生成目录树
Mar 29 Python
opencv python 2D直方图的示例代码
Jul 20 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
基于python+selenium的二次封装的实现
Jan 06 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
python使用建议与技巧分享(二)
Aug 17 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
深入解析NumPy中的Broadcasting广播机制
May 30 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
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php提高网站效率的技巧
2015/09/29 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
javascript 禁止复制网页
2009/06/11 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
Node.js事件驱动
2015/06/18 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
最新销售员个人自荐信
2013/09/21 职场文书
厂长助理岗位职责
2013/12/27 职场文书
项目建议书格式
2014/03/12 职场文书
采购意向书范本
2014/03/31 职场文书
法人代表证明书
2014/09/18 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python