现状:同样是上传图片,不同容器的类型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
      • 如果是body,不会做关于content-type的任何判断,直接交给浏览器处理

    行动:再看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。

    image.png

    image.png
    image.png