首页 > 其他分享 >前端利用formData格式进行数据上传,前端formData 传值 和 json传值的区别?

前端利用formData格式进行数据上传,前端formData 传值 和 json传值的区别?

时间:2023-01-05 16:13:13浏览次数:59  
标签:form type formData content 格式 data 前端 传值

前端利用formData格式进行数据上传,前端formData 传值 和 json传值的区别? 

contentType 常见的格式

  1. text/plain :纯文本格式
  2. application/json: JSON数据格式
  3. application/x-www-form-urlencoded
    中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
  4. multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格
一. json格式传递
fetch(url, {
  method: 'POST', // or 'PUT'
  body: JSON.stringify(data), // data can be `string` or {object}!
  headers: new Headers({
    'Content-Type': 'application/json'  // 需要主动设置,并且将object 用JSON.stringify(data)进行转化
  })
})
二. From URL Encoded - url 编码格式 (qs.stringify 格式)
fetch(url, {
  method: 'POST', // or 'PUT'
  body: qs.stringify(data), // 或者将data转换为formData格式
  headers: new Headers({
    'Content-Type': 'application/x-www-form-urlencoded'  // 不进行header设置的默认格式
  })
})
三 from 非编码格式 - Multipart From (文件流的格式)

由于 涉及文件上传,表单的 提交必须采取非编码格式 即,'content-type':multipart/form-data;boundary=${boundary}
${boundary} 为一分割字符串。但是,重点来了,不管事fetch,还是rxjs的 ajax 只要主动设置 content-type为multipart/form-data,不加后面的boundary,会自动加到传输的格式中,导致后端取不到值。如果加了boundary,又导致直接formData都取不到值。
最终解决方案就是,content-type不进行设置,只将data改为 formData格式。浏览器会自动识别,自动设置为content-type:multipart/form-data;boundary=随机值 的形式。最终上传成功。

export const toFormData = (data: Data) => {
  if (data === null) return null;
  return Object.keys(data).reduce((formData, item) => {
    if (item === 'files') { //特殊判断如果内容为files数组,就让里面值不用走JSON.stringify
      data[item] &&
        data[item].forEach((curr) => {
          formData.append('upload_file[]', curr.originFileObj);
        });
    } else {
      formData.append(item, JSON.stringify(data[item]));
    }
    return formData;
  }, new FormData());
};

总结:

遇到要传JSON值,需要手动设置content-type :application/json;
遇到需要传递From URL Encoded 格式 formData, 需要 手动设置 content-type:application/x-www-form-urlencoded ,并且使用 qs.stringify (data) 将data转换为url格式,才能正常使用
遇到需要文件流 (Multipart From)格式的formData,需要 手动构建formData 数据 ,(new formData,.append('a',1),...), 然后去掉所有的 content-type设置。也就是 不对content-type进行设置。利用formData直接作为 post接口的body值,这样就能正确转化为 'content-type':multipart/form-data;boundary=${boundary} 格式。反正在这种情况下,我实践只能是什么都不传成功了,其他情况都失败了。使用了fetch和 rxjs的ajax,没有使用axios。

标签:form,type,formData,content,格式,data,前端,传值
From: https://www.cnblogs.com/webSnow/p/17027862.html

相关文章

  • 前端react项目打包过程记录
    前端react项目打包过程记录1.打包命令npmrunbuild得到打包后的build文件夹,压缩build文件2.使用serve来运行发布版本该步骤可忽略npminstll-gserveserve-sbui......
  • 前端调试工具(ionic)
    一、调试工具介绍1、firefox插件WebDeveloper1.1.6(最新版本,中文版)主要用于html、css、js的查看和编辑;推荐指数:Firefox上开发和调试web站点的不二之选。Webdeveloper......
  • 【前端】最全Header
    header_k_op:[{label:'Accept',value:'Accept'},{label:'Accept-Charset',value:'Accept-Charset'},{label:'Accept-Encoding',value:'Accept-En......
  • 2023.01.05 - 关于前端在线代码编辑工具的试错总结
    很牛的一件事就是推荐的这几款软件虽然很多都是国外的,但是都可以在国内使用,非常nice!当然我推荐的标准就是哪个适合白嫖党,毕竟我们不太想花8$一个月的价钱去订阅分享代码......
  • 校招前端一面必会vue面试题指南
    写过自定义指令吗?原理是什么回答范例Vue有一组默认指令,比如v-model或v-for,同时Vue也允许用户注册自定义指令来扩展Vue能力自定义指令主要完成一些可复用低层级DOM操......
  • 校招前端二面常考react面试题(边面边更)
    高阶组件高阶函数:如果一个函数接受一个或多个函数作为参数或者返回一个函数就可称之为高阶函数。高阶组件:如果一个函数接受一个或多个组件作为参数并且返回一个组件就......
  • 前端一面常考react面试题
    类组件(Classcomponent)和函数式组件(Functionalcomponent)之间有何不同类组件不仅允许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问store......
  • 前端时间xls表格数据读取和录入
    给了一份表格让把表格里的数据录到系统里,数据有7百多条,表单还很长所以简单写了一个脚本方便快速录入数据,主要用到了js读取表单首先 文件上传<in......
  • 【前端调试】- 断点调试的正确打开方式
    我们有时候会不知道断点打在什么地方,比如想知道dom什么时候被修改的,网络请求在哪里,什么情况才断点。类似情况有很多,需要对应使用不同的打断点方式才可以提高效率,本文演示......
  • 前端网页设计day02
    目录元素之间的关系元素选择器伪类选择器伪元素属性选择器元素之间的关系父元素:直接包含子元素的元素子元素:直接被父元素包含的元素祖先元素:直接或间接包含后代元素的......