在Django中实现文件上传的方式有哪些

  介绍

在Django中实现文件上传的方式有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>一、请求头ContentType:

ContentType指的是请求体的编码类型,常见的类型共有三种:

<强> 1,应用程序/x-www-form-urlencoded

这应该是最常见的帖子提交数据的方式。浏览器的原生& lt; form>表单,如果不设置enctype属性,那么最终就会以应用程序/x-www-form-urlencoded方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST  http://www.example.com , HTTP/1.1   内容类型:应用程序/x-www-form-urlencoded; charset=utf - 8      用户=duoduo&年龄=22

<强> 2,多部分/格式

这又是一个常见的帖子数据提交的方式。我们使用表单上传文件时,必须让& lt; form>表单的enctype等于多部分/格式

POST  http://www.example.com , HTTP/1.1   内容类型:多部分/格式;边界=猈ebKitFormBoundaryrGKCBY7qhFd3TrwA      - - - - - - WebKitFormBoundaryrGKCBY7qhFd3TrwA   附加:格式;,name=皍ser"      +   - - - - - - WebKitFormBoundaryrGKCBY7qhFd3TrwA   附加:格式;,name=癴ile",,文件名=癱hrome.png"   内容类型:图像/png      PNG ……, content  of  chrome.png …   - - - - - - WebKitFormBoundaryrGKCBY7qhFd3TrwA——

这个例子稍微复杂点。首先生成了一个边界用于分割不同的字段,为了避免与正文内容重复,边界很长很复杂,然后内容类型里指明了数据是以多部分/格式来编码,本次请求的边界是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以——边界开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以,——边界标示结束。关于多部分/格式的详细定义,请前往,rfc1867查看。

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

上面提到的这两种职位数据的方式,都是浏览器原生支持的,而且现阶段标准中原生& lt; form>表单也只支持这两种方式(通过& lt; form>元素的,enctype属性指定,默认为,应用程序/x-www-form-urlencoded。其实,enctype还支持,文本/平原,不过用得非常少)。

随着越来越多的网络站点,尤其是WebApp,全部使用Ajax进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。

<强> 3,application/json

application/json这个内容类型作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的json字符串。由于json规范的流行,除了低版本IE之外的各大浏览器都原生支持json。stringify,服务端语言也都有处理JSON的函数,使用JSON不会遇上什么麻烦。

JSON格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据JSON序列化之后来提交的。不过当时我是把JSON字符串作为val,仍然放在键值对里,以x-www-form-urlencoded方式提交。

<强>二,基于形式表单的文件上传

模块部分

& lt; form  action=啊?方法=皃ost", enctype=岸嗖糠?form-data"比;   ,,用户名,& lt; input 类型=皌ext", name=皍ser"比;   ,,头像,& lt; input 类型=癴ile", name=癮vatar"比;   & lt;才能input 类型=皊ubmit"比;   & lt;/form>

视图部分

def 指数(请求):   打印(request.body),才能,#,原始的请求体数据   打印(request.GET),才能,#,让请求数据   打印(request.POST),才能,#,帖子请求数据   打印(request.FILES),才能#,上传的文件数据         return 才能使(请求,“index.html")

<强>三,基于Ajax的文件上传

模块

& lt; form>   ,,用户名,& lt; input 类型=皌ext", id=皍ser"比;   ,,头像,& lt; input 类型=癴ile", id=癮vatar"比;   ,,& lt; input 类型=癰utton", id=癮jax-submit", value=癮jax-submit"比;   & lt;/form>      & lt; script>      美元才能(“# ajax-submit") .click(函数(){   ,,,var  formdata=new  formdata ();   ,,,formdata.append (“user", $ (“# user") .val ());   ,,,formdata.append (“avatar_img", $ (“# avatar") [0] .files [0]);   ,,,. ajax({美元      ,,,,,url:““,   ,,,,,类型:“post",   ,,,,,数据:formdata,   ,,,,,processData: false ,,,//,不处理数据   ,,,,,contentType:,假的,,,//,不设置内容类型      ,,,,,成功:功能(数据){   ,,,,,,,console.log(数据)   ,,,,,}   ,,,})      })才能      & lt;/script>

在Django中实现文件上传的方式有哪些