使用 axios 将原生表单数据与对象和文件反应

Fir*_*res 6 multipartform-data fetch reactjs react-native axios

在此处输入图片说明

所以我想使用 axios 将对象作为数据和文件作为注释上传到 api

uploadToServer= () => {
    const file =this.state.photo

  let data2 ={sale_id:1,
            note_type_id:4,
            description:"test",
            note_content_item:" hi from broker hub"
            
            }



let data = new FormData()
data.append('data[sale_id]', '1')
data.append('data[note_type_id]', '4')

data.append('data[description]', "test")

data.append('data[note_content_item]', "test")







console.log(data)


axios({
  url: api',
  method: 'POST',
  data: data,
  headers: {
   
            'Content-Type' : 'multipart/form-data',
          'Authorization':'Basic YnJva2VyOmJyb2tlcl8xMjM='

  }
})
        .then(resp => console.log(resp.data.response))
        .catch(error => console.error(error)); 

}
Run Code Online (Sandbox Code Playgroud)

首先,我在没有注意的情况下尝试使用数据,我可以在邮递员中完成

在此处输入图片说明

但是我的代码出错了

消息:“无法保存文件” response_code:10

仅当我将密钥从数据更改为其他内容时才会出现此错误 在此处输入图片说明

use*_*046 30

当您使用react-native时,您不需要“form-data”包。因为 React Native 填充了标准FormData api 并将其导出为全局。

第二个问题是axios自动将表单数据转换为字符串,因此您需要根据请求使用transformRequest配置来覆盖它。

import { AxiosRequestConfig } from "axios";
const FormData = global.FormData;

const axiosInstance = axios.create({
    baseURL: 'example.com', // use with scheme
    timeout: 30000,
    headers: {
        "X-Platform": 'iOS',
        "X-App-Build-Number": '1.0.0',
    },
});

const formData = new FormData();
formData.append("userId", "123456");
formData.append("file", {
    uri: "/dev/sda/abc.png",
    type: "image/png",
    name: "abc.png",
});

const config: AxiosRequestConfig = {
    method: "post",
    url: "/process/start",
    responseType: "json",
    headers: {
        'Content-Type': 'multipart/form-data',
        // if backend supports u can use gzip request encoding
        // "Content-Encoding": "gzip",
    },
    transformRequest: (data, headers) => {
        // !!! override data to return formData
        // since axios converts that to string
        return formData;
    },
    onUploadProgress: (progressEvent) => {
        // use upload data, since it's an upload progress
        // iOS: {"isTrusted": false, "lengthComputable": true, "loaded": 123, "total": 98902}
    },
    data: formData,
};

// send post request and get response
const response = await axiosInstance.request(config);
Run Code Online (Sandbox Code Playgroud)

  • “transformRequest”对我来说是关键。它甚至可以是 `transformRequest: (data) => { return data}` 并且它可以工作 (3认同)

Roc*_*cky 12

你没有FormData正确构建,试试这个:

let data = {sale_id:1,
                note_type_id:4,
                description:"test",
                note_content_item:" hi from broker hub"            
                }
const formData = new FormData();
formData.append('data', JSON.stringify(data));
formData.append('Note', {
                     uri: "file://" //Your Image File Path
                    type: 'image/jpeg', 
                    name: "imagename.jpg",
                  });
axios({
       url    : api,
       method : 'POST',
       data   : formData,
       headers: {
                    Accept: 'application/json',
                    'Content-Type': 'multipart/form-data',
                    'Authorization':'Basic YnJva2VyOmJyb2tlcl8xMjM='
                }
            })
            .then(function (response) {
                    console.log("response :", response);
           })
           .catch(function (error) {
                    console.log("error from image :");
           })
Run Code Online (Sandbox Code Playgroud)

  • 请添加注释,`FormData` 来自 `form-data` 包,即来自 ```import FormData from 'form-data'``` 我很难找到正确的,因为默认 FormData 指向 VS Code应用程序的内部版本不正确。 (3认同)