Axios: POST рдЕрдиреБрд░реЛрдз рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдиреЛрдб рдкрд░ рдирд╣реАрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЬреБрд▓ре░ 2017  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: axios/axios

#318 рдХреЗ рд╕рдорд╛рди, рдореИрдВ рдиреЛрдб рдкрд░ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдХреЛрдб рдХрд╛ рдПрдХ рд╣реА рдЯреБрдХрдбрд╝рд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

const fdata = new FormData();
fdata.append('user', u);
fdata.append('hostnames', n.join(' '));
const host = localStorage.getItem('host');
const port = localStorage.getItem('port');
axios({
  url: `http://${host}:${port}/hosts/remove`,
  method: 'post',
  data: fdata
}).then(response => {
  if (response.status === 200) {
    console.log(response.data);
    console.log('Removed host successfully');
  }
  return null;
}).catch(er => console.log(er));

рдиреАрд░рд╡рддрд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

unirest.post(`http://${host}:${port}/hosts/remove`)
.headers({ 'Content-Type': 'multipart/form-data' })
.field('user', u)
.field('hostnames', h.join(' '))
.end(response => {
  console.log(response.body);
});
  • рдЕрдХреНрд╖ рд╕рдВрд╕реНрдХрд░рдг: v0.16.2
  • рдкрд░реНрдпрд╛рд╡рд░рдг: рдиреЛрдб v8.0.0, рд╡рд┐рдВрдбреЛрдЬрд╝ 8.1

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕реЗ #789 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдиреЛрдбрдЬ рдореЗрдВ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд╕рд╛рде form-data рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ FormData рдЬреИрд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
  headers: form.getHeaders(),
}).then(result => {
  // Handle resultтАж
  console.log(result.data);
});

рд╕рднреА 26 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕реЗ #789 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдиреЛрдбрдЬ рдореЗрдВ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд╕рд╛рде form-data рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ FormData рдЬреИрд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
  headers: form.getHeaders(),
}).then(result => {
  // Handle resultтАж
  console.log(result.data);
});

рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЙрд╕ form-data рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдЦреИрд░, рдЕрдм рдпрд╣ рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп JSON рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб API рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рдХреГрдкрдпрд╛ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдбрдЬ рдРрдк рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ ??

@ ar412 рдореИрдВрдиреЗ https://github.com/mzabriskie/axios/issues/1006#issuecomment -320165427 рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдХреНрдпрд╛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ?

@binki рдЕрдЧрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд░реЗрд╕реНрдЯрд╛рдкреА рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдХреА рдПрдкреАрдЖрдИ (рдЬреЛ рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реИ) рдореЗрдВ рдХреИрд╕реЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЖрдк рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ https://expressjs.com/en/4x/api.html#req @ar412

@ ar412 рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк busboy рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ body-parser рдХреЗ рдбреЙрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ ред рдореВрд▓ рд░реВрдк рд╕реЗ, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рдпрд╣ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХреНрд╕рд┐рдпреЛрд╕ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд╣реАрдВ рдФрд░ рдкреВрдЫрдирд╛ рдмреЗрд╣рддрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдЕрдкрд╣реГрдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ ;-)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрддреНрддрд░ SO рдкрд░ рджреЗрдЦреЗрдВред

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓рд╛: form.getHeaders() рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ

@binki
рдЕрд░реЗ! рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ hapi.js рд╕рд░реНрд╡рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ fs.readFile (рдкрде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдХ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореИрдВ рдЗрд╕реЗ рдлреЙрд░реНрдордбрд╛рдЯрд╛() рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ

рдпрд╣ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

fs.readFile(__dirname+'/../static/lisa_server.jpg', (error, imageData) => {
          var form = new FormData()

            form.append('file', imageData,  {
            filename: 'unicycle.jpg', // ... or:
            filepath: '/../static/lisa_server.jpg',
            contentType: 'image/jpg',
            knownLength: 19806
          })

рдлрд┐рд░ рдореИрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдлреЙрд░реНрдо рднреЗрдЬрддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВрдиреЗ рд╡рд┐рдХрд▓реНрдк ['рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░'] = 'рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛' рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ

рдХреНрдпрд╛ рдЖрдк рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА!

@bstolarz рдпрджрд┐ рдЖрдк Buffer , рдЬреЛ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ knownLength рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдкрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ ( form-data рдХреЗ README рдХреЗ тАЛтАЛрдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдЧрд▓рддреА рд╕реЗ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ filename рдпрд╛ filepath рдПрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП - рджреЛрдиреЛрдВ рдирд╣реАрдВред рдХреЗрд╡рд▓ рд╡рд╣реА рдЪреАрдЬреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖ рд╕рдХрддреА рд╣реИрдВ:

  1. filename рдпрд╛ filepath
  2. contentType (рдпрджрд┐ рд╕рд░реНрд╡рд░ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╢рд╛рдпрдж рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдХреНрдпрд╛ рдореИрдВ рд╢рд░реНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЫрд╡рд┐ рдЖрдк рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ рдХреЗ рдЖрдХрд╛рд░ рдПрдХ рдЖрдХрд╛рд░ рд╣реИ рдХрд┐ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ 19806 рдХреНрдпреЛрдВрдХрд┐ рдХрд┐ 19806 рдореВрд▓реНрдп рдХреБрдЫ рд╣реИ рдЖрдк рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдирдХрд▓ form-data рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп form-data рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдпрд╛ HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЕрдорд╛рдиреНрдп рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЬрд╛рдВрдЪрд╛ рдХрд┐ рдХреНрдпрд╛ axios.post() рдХреА рд╡рд╛рдкрд╕реА Promise рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣реА рд╣реИ рдпрд╛ рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реИ? рдпрджрд┐ рдЕрдХреНрд╖реАрдп рдЕрдиреБрд░реЛрдз рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ result рдХреБрдВрдЬреА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ err.result.status рдорд╛рди рдХреНрдпрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ 404 рдпрд╛ 403 рдХреЗ рдЕрд▓рд╛рд╡рд╛ 4xx рдорд╛рди рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдПрдХ рд╡рд┐рдХреГрдд рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЧрд▓рдд рдЬреНрдЮрд╛рдд рдЖрдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@binki
рдЕрд░реЗ, рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдИ рдЧрдИ рдмрд╛рддреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореЗрд░рд╛ рдХреЛрдб рд╣реИ

fs.readFile(__dirname+'/../static/lisa_server.jpg', (error, imageData) => {
          var form = new FormData()

          form.append('file', imageData, {
               filepath: __dirname+'/../static/lisa_server.jpg',
               contentType: 'image/jpg'

          })

рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ 411 рдлреЗрдВрдХрддрд╛ рд╣реИ "рд▓рдВрдмрд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╣реИ" (рдореИрдВрдиреЗ fs.createReadStream рднреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬреЛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣реА рд▓рдВрдмрд╛рдИ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ)ред

@binki
рдореИрдВ рд╣реЗрдбрд░ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рдХреЛ рд╕рдмрд╕реЗ рдирд┐рдЪрд▓реА рдкрд░рдд рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдФрд░ рдореБрдЭреЗ рдЕрдм рд╡рд╣ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИред
рдЕрдм рдЬрдм рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рд╕реЗ 411 рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рд░ 400 рдереА- "рдХреЛрдИ рдлрд╛рдЗрд▓ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЧрдИ"ред

рдЕрдиреБрд░реЛрдз рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрд░реЛрдз

{ adapter: [Function: httpAdapter],
  transformRequest: { '0': [Function: transformRequest] },
  transformResponse: { '0': [Function: transformResponse] },
  timeout: 5000,
  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',
  maxContentLength: -1,
  validateStatus: [Function: validateStatus],
  headers:
   { common: { Accept: 'application/json, text/plain, */*' },
     delete: {},
     get: {},
     head: {},
     post: { 'Content-Type': 'application/json' },
     put: { 'Content-Type': 'application/json' },
     patch: { 'Content-Type': 'application/json' },
     'User-Agent': 'trojan server 1.0',
     'X-Origin-Panamera': 'Staging',
     'Content-Length': 25247 },
  baseURL: 'https://letgoar-a.akamaihd.net/api/v1',
  method: 'post',
  url: 'https://<baseDomain>/api/v1/images',
  data:
   FormData {
     _overheadLength: 218,
     _valueLength: 25247,
     _valuesToMeasure: [],
     writable: false,
     readable: true,
     dataSize: 0,
     maxDataSize: 2097152,
     pauseStreams: true,
     _released: false,
     _streams:
      [ '----------------------------677738213014296377492349\r\nContent-Disposition: form-data; name="file"; filename="/Users/brenda/repos/qreator2/qreator/trojan-server/src/static/lisa_server.jpg"\r\nContent-Type: image/jpg\r\n\r\n',
        <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff e2 11 2c 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 11 1c 61 70 70 6c 02 00 00 00 ... >,
        [Function: bound ] ],
     _currentStream: null,
     _boundary: '--------------------------677738213014296377492349' },
  'Content-Type': 'multipart/form-data' }

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред рдЖрдкрдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдЕрдиреБрд░реЛрдз рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ?

рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж

@bstolarz рдореИрдВрдиреЗ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ Content-Length рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ рдЖрдк Content-Length рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ form-data рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВтАФрдЗрд╕реАрд▓рд┐рдП рдЖрдкрдХреЛ form.getHeaders() рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдкреЗрд╕реНрдЯ рджреЗрдЦреЗрдВ: https://gist.github.com/binki/10ac3e91851b524546f8279733cdadad ред рд╢рд╛рдпрдж рдЖрдк рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП axios.post() рдпрд╛ axios() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛?

рдпрджрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЙрд╕рдХреА рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдФрд░ рдЙрд╕реЗ рд╡рд╣рд╛рдВ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЕрдЯрдХреЗ рд╣реБрдП рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ axios() рдпрд╛ axios.post() рдкрд░ рдХреЙрд▓ рд╕рд╣рд┐рдд рдкреВрд░реНрдг рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдФрд░, рдпрджрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рдЕрднреА рднреА рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ...

@rodrigogs рдпрджрд┐ рдЖрдк рд╕рд╣рд╛рдпрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ;-)ред

рдореИрдВрдиреЗ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдкрд░ рдЗрд╕ рд╕рд╣рд╛рдпрдХ рд╢реЛрдз рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдФрд░ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ( рд▓рд┐рдВрдХ )

рдкреЗрд╢ рд╣реИ рдЗрд╕рдХреА рдХреЙрдкреА/рдкреЗрд╕реНрдЯ:

import fs from 'fs';
import FormData from 'form-data';
import axios from 'axios';

let data = fs.createReadStream(__dirname + '/test.jpg');
let form = new FormData();

form.append('type','image');
form.append('media',data,'test.jpg');

function getHeaders(form) {
    return Promise((resolve, reject) => {
        form.getLength((err, length) => {
            if(err) { reject(err); }
            let headers = Object.assign({'Content-Length': length}, form.getHeaders());
            resolve(headers);
         });
    });
}

getHeaders(form)
.then((headers) => {
    return axios.post(url, form, {headers:headers})
})
.then((response)=>{
    console.log(response.data)
})
.catch(e=>{console.log(e)})

@westofpluto , рдореБрдЭреЗ рднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред @ рдмрд┐рдВрдХреА , рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
рддреНрд░реБрдЯрд┐
form.getHeaders рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ

@smplyjr рдХреНрдпрд╛ рдЖрдк рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ form рдХреИрд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ? рдХреЛрдб рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдиреЛрдбрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреНрд╡реЗрд░реАрд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ:

const querystring = require('querystring')
axios
  .post(URL, querystring.stringify(data))
  .then((response) => ...)
  .catch((error) => ...)

рдЬреИрд╕рд╛ рдХрд┐ @ рд╣реЗрд▓реНрдбреНрд░рд┐рдбрд╛ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, https://www.npmjs.com/package/axios#nodejsред form-data рдкреИрдХреЗрдЬ рдореЗрдВ рдпрд╣рд╛рдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдЕрдкрдиреЗ рдмрд╛рд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрдХрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред

@heldrida @ ashok-sc рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ querystring рдпрд╛ qs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдПрдХ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд▓реИрдореНрдмреНрдбрд╛ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдБ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╣реИ

@bstolarz рдореИрдВрдиреЗ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЖрдк рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ Content-Length рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ рдЖрдк Content-Length рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ form-data рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВтАФрдЗрд╕реАрд▓рд┐рдП рдЖрдкрдХреЛ form.getHeaders() рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдкреЗрд╕реНрдЯ рджреЗрдЦреЗрдВ: https://gist.github.com/binki/10ac3e91851b524546f8279733cdadad ред рд╢рд╛рдпрдж рдЖрдк рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП axios.post() рдпрд╛ axios() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛?

рдпрджрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЙрд╕рдХреА рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдФрд░ рдЙрд╕реЗ рд╡рд╣рд╛рдВ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЕрдЯрдХреЗ рд╣реБрдП рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ axios() рдпрд╛ axios.post() рдкрд░ рдХреЙрд▓ рд╕рд╣рд┐рдд рдкреВрд░реНрдг рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдФрд░, рдпрджрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░реВрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддред рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ рдЕрдм рдореИрдВ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдХреНрд╖реАрдп рдмреИрдХрдПрдВрдб-2-рдмреИрдХрдПрдВрдб рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
const options = { method: 'POST', url: myUrl, data: justJsonBody, transformRequest: [function (data, headers) { const formData = convertToFormData(data); // returrns ForrmData from form-data headers['Content-Type'] = formData.getHeaders()['content-type']; headers['Content-Length'] = formData._overheadLength; return formData; }] };

рдЗрд╕реЗ #789 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдиреЛрдбрдЬ рдореЗрдВ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд╕рд╛рде form-data рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ FormData рдЬреИрд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
  headers: form.getHeaders(),
}).then(result => {
  // Handle resultтАж
  console.log(result.data);
});

рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдПрдЬреЗрдВрдЯ рдХреЛ рдФрд░ рдЕрдиреНрдп рдХреЙрдиреНрдлрд┐рдЧ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

const axios = require('axios');
const FormData = require('form-data');
const ProxyAgent = require('proxy-agent');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios({
  method: 'POST',
  url: 'http://example.org/endpoint',
  data: form,
  agent: new ProxyAgent("https://username:[email protected]:8080"),
  headers: bodyFormData.getHeaders()
}).then(result => {
  // Handle resultтАж
  console.log(result.data);
});

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

// ES6
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';

FormData.prototype.getHeadersWithContentLength = function getHeadersWithContentLength() {
  return new Promise((resolve, reject) => {
    this.getLength((err, length) =>
      err ? reject(err) : resolve({ ...this.getHeaders(), 'Content-Length': length })
    )
  })
}

const payload = new FormData();
const form = new formidable.IncomingForm();

form.parse(req, (err, fields, { file }) => {
  if (err) return;

  payload.append("file", fs.createReadStream(file.path), {
    filename: file.name,
    contentType: file.type
  });

  payload.getHeadersWithContentLength().then(headers => {
    api
      .post(endpoint, payload, { headers })
      .then(({ data }) => data)
      .then(data => res.json({ data }));
  });
});

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рднреА рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реЗ form-data рдлреЙрд░реНрдо рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдШрдВрдЯреЛрдВ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдмреИрдХрдПрдВрдб рдкрд░ рдЬреЛ рдЗрд╕реЗ рдЕрдореЗрдЬрд╝реЕрди рдмрд╛рд▓реНрдЯреА рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╛рдзрд╛рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ content-length рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ ....

рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХреЛрдб рдХреА рддрд░рд╣ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХреЗ :)

const axios = require('axios');
const FormData = require('form-data');

// Where buffer is a file
formData.append('file', buffer);

// Added a promise version like seen in earlier comments to get this
const contentLength = await formData.getLength();

await axios(`<ENDPOINT>`, {
    method: 'POST',
    baseURL: <BASE_URL>,
    params: {
        fileName: '<FILE_NAME>.png'
    },
    headers: {
        authorization: `Bearer <TOKEN>`,
        ...formData.getHeaders(),
        'content-length': contentLength
    },
    data: formData
});

рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реЗ form-data рдлреЙрд░реНрдо рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдШрдВрдЯреЛрдВ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдмреИрдХрдПрдВрдб рдкрд░ рдЬреЛ рдЗрд╕реЗ рдЕрдореЗрдЬрд╝реЕрди рдмрд╛рд▓реНрдЯреА рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╛рдзрд╛рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ content-length рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ ....

рд╣рд╛рдВред рдореИрдВрдиреЗ рдФрд░ рдореЗрд░реЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдмреИрдХрдПрдВрдб рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХрдИ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП, рдЬреЛ рдЙрддреНрддрд░ рджреЗрдЧрд╛ рдХрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рд╕рдмрдорд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рдЬрдмрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рдереЗ рдФрд░ рд╕рд╛рдордЧреНрд░реА рджреЗрдЦ рд╕рдХрддреЗ рдереЗред рд╕рдорд╕реНрдпрд╛ рдЕрдиреБрдкрд▓рдмреНрдз рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдереАред

рдПрдХ рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореЗрдВ рдмрдлрд░ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИ рдпрджрд┐ рдЖрдк formData.getLengthSync() рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ fs.statSync(filePath).size рд╕рд╛рде рд╕реНрдЯреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЬреИрд╕реЗ рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╕реЗ), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рд╕реНрдЯреНрд░реАрдо рдЕрдиреБрд░реЛрдз рдпрд╛ рд╕реЙрдХреЗрдЯ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЖрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреА рд╕реНрдЯреНрд░реАрдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдбрд┐рд╕реНрдХ рд╕реЗ рдЖрддреА рд╣реИ, рддреЛ fs.statSync(filePath).size рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЖрдХрд╛рд░ рджреЗрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЬреНрдЮрд╛рдд рд▓рдореНрдмрд╛рдИ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХреЗрдВ:

formData.append("file", fs.createReadStream(filePath), { filename: 'whatever.pdf', knownLength: fs.statSync(filePath).size });

рдмреЗрд╢рдХ рд╕рднреА рд╕рд┐рдВрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ async рд╡рд╛рд▓реЗ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

// Added a promise version like seen in earlier comments to get this
const contentLength = formData.getLength();

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдлреЙрд░реНрдордбрд╛рдЯрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await рднреВрд▓ рдЧрдП рдереЗ ...

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

samayo picture samayo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Baoyx007 picture Baoyx007  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

achingbrain picture achingbrain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Shu-Ji picture Shu-Ji  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

c0debreaker picture c0debreaker  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ