Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 420
Tri Nguyen Avatar asked Oct 29 '18 04:10

Tri Nguyen


2 Answers

The 2 oldest answers did not work for me. This, however, did the trick:

const FormData = require('form-data'); // npm install --save form-data  const form = new FormData(); form.append('file', fs.createReadStream(file.path));  const request_config = {   headers: {     'Authorization': `Bearer ${access_token}`,     ...form.getHeaders()   } };  return axios.post(url, form, request_config); 

form.getHeaders() returns an Object with the content-type as well as the boundary.
For example:

{ "content-type": "multipart/form-data; boundary=-------------------0123456789" } 
like image 145
blex Avatar answered Oct 04 '22 12:10

blex


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); }); 
like image 43
james emanon Avatar answered Oct 04 '22 12:10

james emanon