在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中实现文件上传的方式有哪些