现状:同样是上传图片,不同容器的类型content-type不一样
问题:到底是设备控制,还是组件控制?
思考:直接引入umi-request,成功调用,然后debugger,是否可以看到关键代码
行动:查看umi-request远吗进行分析
- umi-request,需要指定提交的对象的属性名称
- 如果是data,代码会替你判定它是什么类型
- 如果data的类型是Object和Array,则根据你传递的requestType来决定怎么设置头(必须json和form二选一)
- json 对应 application/json
- form 对应 application/x-www-form-urlencoded
- 如果是其他类型
- 则使用你自定义的content-type
- 如果data的类型是Object和Array,则根据你传递的requestType来决定怎么设置头(必须json和form二选一)
- 如果是body,不会做关于content-type的任何判断,直接交给浏览器处理
- 如果是data,代码会替你判定它是什么类型
行动:再看axios代码的逻辑
- 下载axios代码查看,提交的数据对象如果是formData,就交给浏览器自己处理content-type
结论:
- 解决问题的方法
- 使用data + requestType,除非浏览器检测到类型为data的类型为FormData,否则requestType的值为form时就是被当作x-www-form-urlencoded类型
- 某些浏览器内核(比如iOS下的钉钉打开、iOS下的骑士App扫内的扫码打开,都会将FormData对象识别为Object
- 因此,如果要用umi-request来上传明确就是图片的接口,直接使用body即可
- 更深入需要料了解
- ajax方式和form一样?
- multiple/form-data 和 x-www-form-urlencoded的差异是扫码?
- umi-request是大家使用姿势不对还是源码不清楚?
- 图片和文件上传是一回事吗?
- 各家浏览器都是怎么识别FormData,哪些容器的识别有问题?
上传后,又出现了,后端报错,“只能传图片,不能传视频”,比对请求头的内容后,发现其中一个的filename是file,另外一个则是正确的filename,说明浏览器也不都是能自动帮你加上filename。