POST 文件上传,做过无数次,每次都忘记,一时忘记一时爽,次次忘记次次爽

95 阅读2分钟

只有在有文件数据的时候,才会处理formdata数据,普通接口不要传递formdata数据,没事别瞎JB设置,API接口并不是都需要处理使用formdata的方式来进行

<input onChange={fileChange} type="file" id="file" name="file" />
var resultFile = document.getElementById('file').files[0];

// 从零开始创建 FormData 对象, **只上传文件数据**
var formdata = new FormData();
formdata.append('pn_suffix', values.pn_suffix);
formdata.append('file', resultFile);

var myHeaders = new Headers();
myHeaders.append('X-Auth-Token', getToken(你的token));

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: formdata,   // 自动修改请求头,formdata的默认请求头的格式是 multipart/form-data
};

// 调用
fetch(`${API_SERVER}`, requestOptions);

进行Post请求的时候会根据场景发送不同类型的数据, Content-Type: 比如说application/x-www-form-urlencoded、application/json、multipart/form-data、raw等

有时候会需要请求时来手动设置,不过大部分情况下浏览器会根据Body中的数据来自发的设置相应的请求头, 所以一定不要瞎XX设置

一般来说,将<form></form>标签中的enctype设置为multipart/form-data就可以发送

<form action="update.com" method="post" enctype="multipart/form-data">
    <p>
      name: <input type="text" name="firstname" /><br />
      <input type="file" name="file" />
    </p>
    <p>
      <input type="submit" />
    </p>
</form>
在这种表单提交的情景下,我们不需要手动设置Content-Type,
所以也不用去管Body中的数据是如何排列的,不需要知道boundary是什么,这些都有浏览器来自动完成。

post请求体(Body)中为 multipart/form-data

  • 既可以上传键值对,也可以上传文件

post请求体(Body)中为 x-www-form-urlencoded

  • 会将表单内的数据转换为键值对,比如,username=张三, 只能上传键值对,并且键值对都是间隔分开的,只是最后会转化为一条信息

raw

  • 以上传任意格式的文本,可以上传text、json、xml、html等
  • content-type= text/html(HTML 文档);text/plain(纯文本);text/css(CSS 样式表);application/json (json字符串)

binary

  • 相当于Content-Type:application/octet-stream
  • 从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件

【相关文献】:zhuanlan.zhihu.com/p/195726295

【相关文献】:blog.csdn.net/Eat_a_meal/…

【相关文献】:developer.mozilla.org/zh-CN/docs/…

【相关文献】:developer.mozilla.org/zh-CN/docs/…

结语

前端react QQ群:788023830 ---- React/Redux - 地下老英雄

前端交流QQ群:249620372 ---- FRONT-END-JS前端

(我们的宗旨是,为了加班,为了秃顶……,仰望大佬),希望小伙伴们加群一起学习