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使用nntp读取新闻组内容的方法
May 08 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
Python实现模拟浏览器请求及会话保持操作示例
Jul 30 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
如何基于线程池提升request模块效率
Apr 18 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
PHP操作文件方法问答
2007/03/16 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
javascript 鼠标滚轮事件
2009/04/09 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
python中的变量如何开辟内存
2018/06/26 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
Python函数中不定长参数的写法
2019/02/13 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
c语言常见笔试题总结
2016/09/05 面试题
静态变量和实例变量的区别
2015/07/07 面试题
护理专业毕业生自我鉴定
2013/10/08 职场文书
公司企业表扬信
2014/01/11 职场文书
致800米运动员广播稿
2014/02/16 职场文书
人民调解员培训方案
2014/06/05 职场文书
班级文化标语
2014/06/23 职场文书
民族学专业求职信
2014/07/28 职场文书
辞职信格式范文
2015/05/13 职场文书
新闻稿件写作范文
2015/07/18 职场文书
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers