Search code examples
node.jsaxiosmultipartform-data

NodeJS, Axios - post file from local server to another server


I have an API endpoint that lets the client post their csv to our server then post it to someone else server. I have done our server part which save uploaded file to our server, but I can't get the other part done. I keep getting error { message: 'File not found', code: 400 } which may mean the file never reach the server. I'm using axios as an agent, does anyone know how to get this done? Thanks.

// file = uploaded file
const form_data = new FormData();
form_data.append("file", fs.createReadStream(file.path));
const request_config = {
    method: "post",
    url: url,
    headers: {
        "Authorization": "Bearer " + access_token,
        "Content-Type": "multipart/form-data"
    },
    data: form_data
};
return axios(request_config);

Update

As axios doc states as below and the API I'm trying to call requires a file

// data is the data to be sent as the request body // Only applicable for request methods 'PUT', 'POST', and 'PATCH' // When no transformRequest is set, must be of one of the following types: // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams // - Browser only: FormData, File, Blob // - Node only: Stream, Buffer

Is there any way to make axios send a file as a whole? Thanks.


Solution

  • I'm thinking the createReadStream is your issue because its async. try this. Since createReadStream extends the event emitter, we can "listen" for when it finishes/ends.

    var newFile = fs.createReadStream(file.path);
    
    // personally I'd function out the inner body here and just call 
    // to the function and pass in the newFile
    newFile.on('end', function() {
      const form_data = new FormData();
      form_data.append("file", newFile, "filename.ext");
      const request_config = {
        method: "post",
        url: url,
        headers: {
            "Authorization": "Bearer " + access_token,
            "Content-Type": "multipart/form-data"
        },
        data: form_data
      };
      return axios(request_config);
    });