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简单文本处理的方法
Jul 10 Python
简单谈谈python中的Queue与多进程
Aug 25 Python
Sanic框架配置操作分析
Jul 17 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
对python读取CT医学图像的实例详解
Jan 24 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
python画图常规设置方式
Mar 05 Python
python实现FTP循环上传文件
Mar 20 Python
如何在Windows中安装多个python解释器
Jun 16 Python
pytorch通过训练结果的复现设置随机种子
Jun 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开发中的错误收集,不定期更新。
2011/02/03 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php中执行系统命令的方法
2015/03/21 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
短信提示使用 特效
2007/01/19 Javascript
Javascript实现的分页函数
2007/02/07 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
python如何统计代码运行的时长
2019/07/24 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
python中@contextmanager实例用法
2021/02/07 Python
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
元旦联欢会主持词
2014/03/26 职场文书
小学生暑假家长评语
2014/04/17 职场文书
合伙协议书范本
2014/04/21 职场文书
北京奥运会主题口号
2014/06/13 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python