Axios: рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': 'рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛' рдХреЗ рд╕рд╛рде рдПрдХ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдордИ 2016  ┬╖  99рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: axios/axios

рдореИрдВрдиреЗ рдЖрдЬ рдХреБрдЫ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП рд╣реИрдВ рдФрд░ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ XMLHttpRequest рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рд▓реЗрдХрд┐рди рдпрд╣ Axios рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ XMLHttpRequest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

let data = new FormData();

data.append('action', 'ADD');
data.append('param', 0);
data.append('secondParam', 0);
data.append('file', new Blob([payload], { type: 'text/csv' }));

// this works
let request = new XMLHttpRequest();
request.open('POST', url);
request.send(data);

рдЙрд╕рдХрд╛ 'Axios' рд╕рдВрд╕реНрдХрд░рдг рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

рдпрд╣рд╛рдБ рдореЗрд░реА рдХреЛрд╢рд┐рд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ (рд╕рд░рд▓ рдПрдХ):

// this won't work
const config = { headers: { 'Content-Type': 'multipart/form-data' } };
    axios.post(url, data, config)
    .then(response => console.log(response))
    .catch(errors => console.log(errors));

рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдФрд░ Axios рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдорд╣рд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

@rafaelbiten рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:

const data = new FormData();

data.append('action', 'ADD');
data.append('param', 0);
data.append('secondParam', 0);
data.append('file', new Blob(['test payload'], { type: 'text/csv' }));

axios.post('http://httpbin.org/post', data);

рдбреЗрдЯрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛:

screen shot 2016-05-12 at 9 12 19 pm

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

рдХреЛрдб рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред (рдЖрдкрдХреЛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред) рдЬрдм рдЖрдк axios рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдпрд╛ рди рдХрд░рдирд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдПрдХреНрд╕рд┐рдУрд╕ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдмреИрдХрдПрдВрдб рд▓рд╛рдкрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ред

рдореИрдВ 0.9.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ 0.11.0 рдкрд░ рдмрдиреА рд╣реБрдИ рд╣реИред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдФрд░ рд╣реИ рдЬреЛ рдореИрдВ рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдареАрдХ рд╣реИ?
рдЯрдХреНрд╕ @nickuraltsev !

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреНрд░реЛрдо рджреЗрд╡ рдЙрдкрдХрд░рдг рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдирд▓ рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ?

@nickuraltsev рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ:

screen shot 2016-05-11 at 2 56 12 pm

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЧрд▓рдд рд╣реИрдВред

рддреЛ рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдкреЗрд▓реЛрдб рдирд╣реАрдВ рд╣реИ?

рдареАрдХ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ (рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛)ред

рд╕рдордЭрд╛ред рдФрд░ рджреЗрд╡ рдЯреВрд▓реНрд╕ рдореЗрдВ рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдкреЗрд▓реЛрдб рдЕрдиреБрднрд╛рдЧ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

рд╕рдВрднрд╡рддрдГ рд╕рдВрдмрдВрдзрд┐рдд рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╕рдорд╕реНрдпрд╛ред рдЬрдм рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЙрдиреНрдлрд┐рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрджрд╛
axios.post(
'https://example.com/login',
{рдИрдореЗрд▓ рдкрддрд╛: рдИрдореЗрд▓, рдкрд╛рд╕рд╡рд░реНрдб: рд╣реИрд╢реЗрдбрдкрд╛рд╕рд╡рд░реНрдб},
{рд╣реЗрдбрд░: {'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': 'рдПрдкреНрд▓рд┐рдХреЗрд╢рди/рдЬреЗрд╕рди'}}
);

рд╣реЗрдбрд░ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди/рдЬреЗрд╕рди, рдПрдкреНрд▓рд┐рдХреЗрд╢рди/рдЬреЗрд╕рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд░реАрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

@nickuraltsev рд╕рд╣реА! рдЖрдк рдЙрд╕ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░ рдЬреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╣ рд╕рдм рдореЗрд░реЗ рдкрд╛рд╕ рджреЗрд╡ рдЯреВрд▓реНрд╕ рдкрд░ рд╣реИред
@rrapant рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 'Content-Type' рд╕реЗрдЯ рдХрд░рдирд╛ рдпрд╛ рдирд╣реАрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреАред

@rrapant рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ #317 рджреНрд╡рд╛рд░рд╛ рддрдп рдХреА рдЧрдИ рд╣реИред рдлрд┐рдХреНрд╕ рдХреЛ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

@rafaelbiten рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:

const data = new FormData();

data.append('action', 'ADD');
data.append('param', 0);
data.append('secondParam', 0);
data.append('file', new Blob(['test payload'], { type: 'text/csv' }));

axios.post('http://httpbin.org/post', data);

рдбреЗрдЯрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛:

screen shot 2016-05-12 at 9 12 19 pm

@rafaelbiten рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ FromData рдХреЗ рд╕рд╛рде http://httpbin.org/post рдкрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рд╣рд╛рдп @nickuraltsev , рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред

      var fd = new FormData();
      fd.append('file', this.refs.multipartfiles.files[0]);

            const config = { headers: { 'Content-Type': 'multipart/form-data' } };
            axios.post('/dataAPI/sendFile', {
                "UploadCommand": fd
              }, config)
              .then(function (response) {
                console.log(response);
              })
              .catch(function (error) {
                console.log(error);
              });

рдХреГрдкрдпрд╛ рдореЗрд░реА рд╣реЗрдбрд░ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕реНрдХреНрд░реАрди рд╢реЙрдЯ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ,

image

рдореЗрд░рд╛ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ, _рдХреНрдпрд╛ axios рдиреЛрдб рд╕рд░реНрд╡рд░ рдкрд░ рдмрд╣реБ-рднрд╛рдЧ рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЗрдВ рднреЗрдЬрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?_

@ рд╢реНрд░реАрдЦрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?
axios.post('/dataAPI/sendFile', fd, config)

рдпрджрд┐ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рднрд╛рдЧ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ 'рдЕрдкрд▓реЛрдб рдХрдорд╛рдВрдб' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
fd.append('UploadCommand', this.refs.multipartfiles.files[0]);

@yungpanda рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдм рдПрдкреАрдЖрдИ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╡реИрд╕реЗ рднреА рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдереНрд░реЗрдб рдХреЛ рдЕрдкрдбреЗрдЯ рд░рдЦреВрдБрдЧрд╛ред рдЖрдкрдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@рд╢реНрд░реАрдЦрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдорд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ

@nickuraltsev рдпрд╣ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдиреЛрдб рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

const data = new FormData();

data.append('action', 'ADD');
data.append('param', 0);
data.append('secondParam', 0);

axios.post('http://httpbin.org/post', data).then(req => {
  console.log('Req done: ', req)
}).catch(err => {
  console.error('Error: ', err)
})

рддреНрд░реБрдЯрд┐: рдЕрдВрдд рдХреЗ рдмрд╛рдж рд▓рд┐рдЦреЗрдВ

@krzkaczor рдХреНрдпрд╛ рдЖрдкрдХреЛ axios рдХреЗ рд╕рд╛рде рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдо рдорд┐рд▓рд╛ рд╣реИ?

@PierreCavalet рдирд╣реАрдВ , рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп request-promise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

@krzkaczor рдзрдиреНрдпрд╡рд╛рдж, рднреА рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░

@krzkaczor рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

const config = { headers: { 'Content-Type': 'multipart/form-data' } };
let fd = new FormData();
fd.append('file',files[0])
return axios.post("http://localhost:5000/upload", fd, config)

@krzkaczor рдореИрдВ рднреА axios рдФрд░ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХреНрдпрд╛ рдЖрдк рдЕрдиреБрд░реЛрдз-рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рд╕рд╛рд░ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ dan-boa рдпрд╣рд╛рдБ рдЖрдк рдЬрд╛рддреЗ рд╣реИрдВ: https://gist.github.com/krzkaczor/bdbe09d4096b051a3c18387c4ca79a06 рдпрд╣ рдПрдХ рд╣реИрдХ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреИрд╕реЗ рднреЗрдЬреЗрдВ (рдкрде рд╕реЗрдЯрд┐рдВрдЧ)

рдЕрдЧрд░ рдХреЛрдИ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ FormData рдХреЗ рд╕рд╛рде axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрдлрд░ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╣реА рд╣реЗрдбрд░ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

const concat = require("concat-stream")
const fd = new FormData()

fd.append("hello", "world")
fd.append("file", fs.createReadStream(file))
fd.pipe(concat(data => {
  axios.post("/hello", data, {
    headers: fd.getHeaders()
  })
}))

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдиреЛрдб рдореЗрдВ рдирд╣реАрдВ)ред рдпрджрд┐ рдЖрдк Content-Type рд╣реЗрдбрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ axios рдХреЛ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рджреЗрдВ (рдпрд╣ рднреА рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рд╣реЗрдбрд░ рдХреЛ axios рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдореЗрдВ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдХреЙрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ, рдЖрдк рдлреЙрд░реНрдордбрд╛рдЯрд╛ () рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЕрдХреНрд╖реАрдп рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ)

рдХрд┐рд╕реА рдЕрдиреНрдп рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдиреЛрдб рдкрдХреНрд╖ рдореЗрдВ рдЕрдиреБрд░реЛрдз-рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣рд╛ рдерд╛ред

рдореИрдВрдиреЗ рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ рдЕрдиреБрд░реЛрдз-рд╡рд╛рджрд╛ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ред рдкреНрдпрд╛рд░ рдЕрдХреНрд╖рддрдВрддреБ рдЕрдиреНрдпрдерд╛!

@guncha рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП 0.15.3 рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрдм рддрдХ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬреЛ рдпреВрдЯреАрдПрдл 8 рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдХреЙрдирдХреИрдЯ рдХреЛ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред

const concat = require("concat-stream")
const fd = new FormData()

fd.append("hello", "world")
fd.append("file", fs.createReadStream(binaryFile))
fd.pipe(concat({encoding: 'buffer'}, data => {
  axios.post("/hello", data, {
    headers: fd.getHeaders()
  })
}))

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:

const promise = new Promise((resolve) => {
  const fd = new FormData();
  fd.append("hello", "world");
  fd.append("file", fs.createReadStream(binaryFile));
  fd.pipe(concat({ encoding: 'buffer' }, data => resolve({ data, headers: fd.getHeaders() })));
});
promise.then(({ data, headers }) => axios.post('/hello', data, { headers }));
const callApi = (url, params) => {
  const formData  = new FormData()
  for(let name in params) {
    let param = params[name]
    if (typeof param === 'object') {
      param = JSON.stringify(params[name])
    }
    formData.append(name, param)
  }

  return axios.post(url, formData)
    .then(response => {
      console.log(response)
    })
}

@guncha рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдореБрджреНрджрд╛

рдмрд╕ рд╕реАрдорд╛ рдЬреЛрдбрд╝реЗрдВ Content-Type :

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

let data = new FormData();
data.append('file1', fs.createReadStream('./image1.jpeg'), 'image1.jpeg');
data.append('file2', fs.createReadStream('./image2.jpeg'), 'image2.jpeg');

let options = {
    method: 'POST',
    url: 'http://localhost:3200/upload',
    headers: {
        'Content-Type': `multipart/form-data; boundary=${data._boundary}`
    },
    data
};

return request(options)
    .then(response => {
        console.log(response);
    });

рдЕрд░реЗ,
рдореБрдЭреЗ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЬреЗрд╕рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕реЗ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо java8.
"body": "------WebKitFormBoundaryQsJGeBuR8e9dQ4Pm\r\nContent-Disposition: form-data; name=\"file\"; filename=\"backup prolog.txt\"\r\nContent-Type: text/plain\r\n\r\n%All the Pre-Defined relations\r\nconnected(hira,rohit,father).\r\nconnected(rohit,rakesh,father).\r\nconnected(ram,hira,father).\r\nconnected(kavri,hira,mother).\r\nconnected(hira,kavri,son).\r\nconnected(arun,vinayak,father).\r\nconnected(vinayak,arun,son).\r\nconnected(arun,shashi,husband).\r\nconnected(shashi,arun,wife).\r\nconnected(vinayak,vardaan,brother).\r\nconnected(vardaan,vinayak,brother).\r\nconnected(shashi,vinayak,mother).\r\nconnected(vinayak,shashi,son).\r\n\r\n\r\n\r\nconnected2(X,Y,D) :- connected(X,Y,D).\r\n%connected2(X,Y,D) :- connected(Y,X,D).\r\n\r\nnext_node(Current, Next,R, Path) :-connected2(Current, Next, R),not(member(Next, Path)).\r\n\r\nfunc(how,is,X,related,to,Y):-depth_first(X,Y,[X],P),write(P).\r\n%Procedure to Start the depth_first\r\ndepth_first(Goal, Goal, _, [Goal]).\r\n\r\ndepth_first(Start, Goal, Visited, [Start,is,R,of|Path]) :-next_node(Start, Next_node,R, Visited),depth_first(Next_node, Goal,[Next_node,R|Visited], Path).\r\n\r\n\r\n\r\n\r\n\r\n\r\n------WebKitFormBoundaryQsJGeBuR8e9dQ4Pm--\r\n"
рдзрдиреНрдпрд╡рд╛рдж

рдХреЛрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдиреЛрдб рдкрд░ рдирд╣реАрдВред

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));

рдирдорд╕реНрддреЗ @рд╢реНрд░реАрдЦрд╛рд░
рдореЗрд░реЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛
const config = { headers: { 'Content-Type': 'application/json' } };
рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛

рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╕рдВрдЧрдд рдЙрддреНрддрд░/рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╣реЛрдиреЗ рддрдХ рдХреГрдкрдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЕрднреА рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

+1 рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВ

HTTP рдкреЛрд╕реНрдЯ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, axios v0.16.2 . рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

// The following was tested successfully with axios v0.16.2

// Create a new form.  Note:  could also specify an existing form as
// the parameter to the FormData() constructor to copy all the elements
// from the existing form to the new one being created.

var tempFormData = new FormData();

var someNoteValue = 'Hello World';
var someAudioData = [];  // populate this with data from file, with MediaRecorder() etc.


// Add form fields

tempFormData.set('SomeNote', 'Hello World');
tempFormData.set('SomeRecording', someAudioData[0], 'SampleRecording.webm');


// Optional:  output list of form fields to the console for debugging

for (var pair of tempFormData.entries()) {
    console.log('Form field: ' + pair[0] + ', ' + pair[1]);
}


// Call Axios to post the form to myurl

axios({
    method: 'post',
    url: 'myurl',
    data: tempFormData,
    config: { headers: {'Content-Type': 'multipart/form-data' }}
})
    .then(function (response) {
        //handle success
        console.log(response);
    })
    .catch(function (response) {
        //handle error
        console.log(response);
    });

            }

рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

      const form = new FormData();
      const fileBuffer = new Buffer(
        'MM2 - noticeably shallower than the original - score: 101%', 'utf-8'
      );
      form.append('name', 'reviews.txt'); // additional form data field
      form.append('file', fileBuffer, 'original-file-name.bar');

      const res = await axios.post(`/uploadfile`, form, { headers: form.getHeaders() });

рдиреЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Axios рдЙрджрд╛рд╣рд░рдг рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдВ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреЗрдЯрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рд╣реИред рдЖрдк рдпрд╣ рднреА рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ Axios рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ (axios.defaults.headers рдФрд░ axios.defaults.parameters рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред

рдпрд╣ рдмрд┐рдВрджреБ рдкрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ body-parser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЗ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдкрд░ рднрд╛рдЧ рдЧрдпрд╛:

https://philna.sh/blog/2016/06/13/the-surprise-multipart-form-data/

TL; DR - body-parser рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, axios рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ body-parser рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдмрдлрд░ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ!

рдореЗрд░реЗ рд╕рд╛рде рднреА рд╡рд╣реА рджрд┐рдХреНрдХрдд рд╣реИред рдореИрдВ Axios 0.16.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ XMLHttpRequest рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди Axios рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдореВрд▓ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ:

рдХреЙрдиреНрд╕реНрдЯ рдлреЙрд░реНрдордбрд╛рдЯрд╛ = рдирдпрд╛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ ();
formData.append ('рдирд╛рдо', 'рдЯреЗрдХреНрд╕реНрдЯрдирд╛рдо');

рдореИрдВрдиреЗ @Janekk рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

axios({
      method: 'post',
      url,
      withCredentials: true,
      data: { formData },
    })

рдлрд┐рд░ @faalkhah рдХрд╛ рд╕реБрдЭрд╛рд╡:

const config = { headers: { 'Content-Type': 'application/json' } };
    axios({
      method: 'post',
      url,
      withCredentials: true,
      data: { formData },
      config,
    })

рдпрд╛ @askona рдХрд╛ рд╕реБрдЭрд╛рд╡:

const config = { headers: { 'Content-Type': undefined } };
    axios({
      method: 'post',
      url,
      withCredentials: true,
      data: { formData },
      config,
    })

рдЕрдиреБрд░реЛрдз рд╣реИрдбрд░ application/json рд╣реИ рдФрд░ formData рдЦрд╛рд▓реА рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ @ demeter-macik рдлрд┐рдХреНрд╕ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдмреИрдХ-рдПрдВрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ https://stackoverflow.com/a/13454425/968379

рдирдорд╕реНрддреЗ,
рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ
рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдореЗрд░рд╛ рдХреЛрдб
`

    const url = '/file/uploadTest';
    const formData = new FormData();
    formData.append('file', file);
    formData.append('params1', value);
    formData.append('params2', value2)

    const config = {
        headers: {
            'Content-Type': 'multipart/form-data',
        }
    }
    axios.post(url,formData,config)`

рд╕реЗрд▓ рд╕рд░реНрд╡рд░ рдореЗрдВ, рдореИрдВ рд▓реЙрдЧ рдХрдВрд╕реЛрд▓ req.body
рдореИрдВрдиреЗ рдкрд╛рдпрд╛, рдЬрдм рдореИрдВ 10 рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд▓рдЧрднрдЧ 3 4 рдмрд╛рд░ рд╕рд░реНрд╡рд░ рдХреЛ рд╢рд░реАрд░ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рд╢рд░реАрд░ рдЦрд╛рд▓реА рд╣реИ)ред
рдореИрдВрдиреЗ рдХреНрд░реЛрдо рдХреЗ devtool рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рдЕрднреА рднреА рдкреЗрд▓реЛрдб рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдмреЙрдбреА рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдЕрднреА рднреА рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ

рд╡рд╣ рдЕрдиреБрд░реЛрдз рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╣реИред

`рдХреЛрдб

    const url = '/file/uploadTest';
    const formData = new FormData();
    formData.append('file', file);
    formData.append('params1', value);
    formData.append('params2', value2)
    const config = {
        headers: {
            'Content-Type': 'multipart/form-data',
            'params1': value,
            'params2': value2
        }
    }
    axios.post(url,formData,config)`

рд╣рд╛рдп @ рд╢реНрд░реАрдЦрд░ ,
рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛? рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреГрдкрдпрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж

рдирдорд╕реНрддреЗ,

рдореИрдВ рдорд▓реНрдЯреАрдлреЙрд░реНрдордбреЗрдЯрд╛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╣ рдПрдХ рдПрдЬрд╝реНрдЯреЗрдХреНрд╕реНрдЯ рдПрд╕рдПрдордПрд╕ рдПрдкреАрдЖрдИ рд╣реИ)
рдиреЛрдб.рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдЕрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ,
рдирдпрд╛ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ (рдлрд╝рдВрдХреНрд╢рди (рд╕рдорд╛рдзрд╛рди, рдЕрд╕реНрд╡реАрдХрд╛рд░) {

        var request = require("request");
        var options = {
            method: 'POST',
            url: 'https://app.eztexting.com/sending/messages',
            qs: {format: 'json'},
            formData:
                {
                    User: '**',
                    Password: '**',
                    'PhoneNumbers[0]': '8572222***',
                    Message: 'Appointment Reminder',
                    MessageTypeID: '1'
                }
        };
        request(options, function (error, response, body) {
            if (error) {
                console.log(error);
                reject(error);
            }
            else {
                console.log(response);
                resolve(response);
            }

            // console.log(body);
        });

рд▓реЗрдХрд┐рди рдпрд╣ axios рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрд╕рдПрдордПрд╕ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП 200 рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ: -
var axios = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдЕрдХреНрд╖реАрдп');

         axios.post('https://app.eztexting.com/sending/messages', {
             qs: { format: 'json' },
             headers: {
                 'Content-Type': 'application/x-www-form-urlencoded'
             },
             formData:
                 { User: '****',
                     Password: '2sH****5',
                     'PhoneNumbers[0]':'85722******',
                     Message: 'Hello Yahska',
                     MessageTypeID: 1 }
         })
             .then(function (response) {
                 console.log(response);
             })
             .catch(function (error) {
                 console.log(error);
             });

рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз 'рдЕрдиреБрд░реЛрдз' рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╕рдлрд▓ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ?

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХреЛрдИ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХреЛ JSON рд╕реЗ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ?
рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рд▓реЗрдЦ (рдЕрд░реНрдерд╛рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╢реАрд░реНрд╖рд▓реЗрдЦреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

async function sendMessage(myJSONPayload){
  try{
    const data = convertJSON2FormData(myJSONPayload);

    const response = await axios.post('https://app.eztexting.com/sending/messages', {
  data
});
    console.log(response);
  } catch(ex){
    console error(err);
  }
}

sendMessage ({ User: '****',
                     Password: '2sH****5',
                     'PhoneNumbers[0]':'85722******',
                     Message: 'Hello Yahska',
                     MessageTypeID: 1 }
         });

JSON рд╕реЗ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрддреНрддрд░ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдмреИрдХрдПрдВрдб рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╕рдордп рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕рдорддрд▓ рдХрд░рддреЗ рд╣реИрдВ:

{a: {b: 2}} --> formData.append("a.b",2)

рдпрд╣рд╛рдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ред

рдмреЗрд╢рдХ, @michaelscheurer! рдЕрдиреБрд░реЛрдз рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╕реЗрдЯ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ: рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдЬрдорд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдЪрд┐рдд рд╕реАрдорд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ... рди рд╣реА axios рдФрд░ рди рд╣реА рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рдЖрдкрдХреЗ рд▓рд┐рдП JSON рдбреЗрдЯрд╛ рдХреЛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдЧрд╛ред Axios рдпрд╣ рдкрд╣рдЪрд╛рди рд▓реЗрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рднреА рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрддреНрддрд░ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ...

@Iamuertepeluda
рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬрд╝реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВ, рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд╕реНрдерд┐рддрд┐ 200 рдареАрдХ рд╣реИ рд▓реЗрдХрд┐рди рдПрд╕рдПрдордПрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ
var axios = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдЕрдХреНрд╖реАрдп');

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

    const form = new FormData();

    //fo this jason I created a form
    // formData:
    // {
    //     User: '*****',
    //         Password
    // :
    //     '******',
    //         'PhoneNumbers[0]'
    // :
    //     '8****2763',
    //         Message
    // :
    //     'Appointment Reminder',
    //         MessageTypeID
    // :
    //     '1'
    // }

    form.append('User','****');
    form.append('Password','*****');
    form.append('PhoneNumbers[0]','*****');
    form.append('Message','Appointment Reminder');
    form.append('MessageTypeID','1');


         axios.post('https://app.eztexting.com/sending/messages', form,
    {
        qs: {format: 'json'},
        headers:
        {
                'content-type'
        :
            'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
        }
    }
)
             .then(function (response) {
                 console.log(response);
             })
             .catch(function (error) {
                 console.log(error);
             });

@ рд░реБрдЪрд┐ 2729 рдХреНрдпрд╛ рдЖрдк рдиреЛрдб.рдЬреЗрдПрд╕ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЖрдкрдХреЛ const FormData = require('form-data'); рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореВрд▓ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реЗрдбрд░ рдФрд░ рдХреНрдпреВ рд╕реЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдпрд╛ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ

axios.request({
 url: "https://app.eztexting.com/sending/messages"
 type: "post",
 data: form //the instance of FormData of your stub
});

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

@ рд░реБрдЪрд┐ 2729 рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред
рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ axios рдХреЗ рд╕рд╛рде form-data рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ eztexting рдХреЗ рд╕рд╛рде SMS рднреЗрдЬрдиреЗ рдХрд╛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ? рдЙрдирдХреЗ рдбреЙрдХреНрд╕ рд╕реЗ рдпрд╣ рдЕрд▓рдЧ рд▓рдЧрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдиреЛрдб рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ...

рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕рд╣рд┐рдд рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдЙрда рд░рд╣реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдкреЛрд╕реНрдЯрдореИрди рдкрд░ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ multipart/form-data рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реВрдВ, рддреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

screen shot 2018-03-26 at 12 22 35 am

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдмреЗрд╕ 64 рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛-рдпреВрд░реА рдХреЛ рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реА рдереАред рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдЗрд╕реА рдореБрджреНрджреЗ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдирдореВрдирд╛ рдХреЛрдб рджрд┐рдП рдЧрдП рд╣реИрдВ:

async function importCsv(data: CsvImportData): Promise<void> {
    const formData = new FormData();
    const headers = {'Content-Type': 'multipart/form-data'};

    formData.append('csv', dataURItoFile(data.file, `upload_${Date.now()}.csv`));

    try {
      await axios.post('https://example.com/api/upload/csv', formData, {headers});
    } catch(e) {
      console.error(e);
    }
}

function dataURItoFile(dataURI: string, defaultFileName: string): File {
  let byteString: string;
  const [metadata, data] = dataURI.split(',');
  if (/base64$/.test(metadata)) {
    byteString = atob(data);
  } else {
    byteString = unescape(data);
  }

  const mimetype: string = metadata.split(':')[1].split(';')[0];
  const filename: string = (metadata.match(/name\=(.*);/) || [])[1] || defaultFileName;

  let dataView: Uint8Array = new Uint8Array(byteString.length);
  for (let i = 0; i < byteString.length; i++) {
    dataView[i] = byteString.charCodeAt(i);
  }
  return new File([dataView], filename);
}

рдЕрд░реЗ рдореИрдВ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ: - https://www.eztexting.com/developers/sms-api-documentation/rest#Sending
рдПрдкреАрдЖрдИ рдХреБрдВрдЬреА рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@ рд░реБрдЪрд┐ 2729
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдиреЗрдХреНрд╕рдореЛ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реВрдВ, рдЬреЛ рдПрдХ рдФрд░ рдПрд╕рдПрдордПрд╕ рд╕реЗрд╡рд╛ рд╣реИ рдФрд░ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ

рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк format рдХреЛ json рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ axios рдХреЛ JSON рдкреЗрд▓реЛрдб рднреЗрдЬрдиреЗ рджреЗрдВ (рдЖрдк рдЗрд╕реЗ рдкреЗрд▓реЛрдб рдкреНрд░рд╛рд░реВрдк рджреНрд╡рд╛рд░рд╛ рд╣реЗрдбрд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ)

https://app.eztexting.com/sending/messages?format=json

рдореИрдВ рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЬреВрдЭрддрд╛ рд░рд╣рд╛ рдЬрд┐рд╕реЗ рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдореИрдВ рдПрдХреНрд╕рд┐рд╕, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рдлрд╛рдЗрд▓рдЕрдкрд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдкреИрд░рд╛ рдХреЗ рд╕рд╛рде рдиреЛрдб рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ req.files рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓реЗрдВ рдЙрдард╛рддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдмрд╛рдХреА рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЛ req.body['yourfilename'] рдХреЗ рд╕рд╛рде рдЙрдард╛рддрд╛ рд╣реВрдВред

рд╕рд░реНрд╡рд░ (рдПрдХреНрд╕рдкреНрд░реЗрд╕):

screen shot 2018-03-27 at 1 59 08 pm

router.post('/helper/amazon/upload', function(req, res) { if (!req.files) { return res.status(400).send('No files were uploaded.') } console.log(req.body.filename); return console.log(req.files);

рдлреНрд░рдВрдЯ-рдПрдВрдб (рдЕрдХреНрд╖реАрдп)

screen shot 2018-03-27 at 1 58 45 pm

const formData = new FormData(); formData.append('file', this.validFile); formData.append('filename', 'trails/' + this.$route.params.id.split('-')[0] + '/camping/'); axios.post( /api/helper/amazon/upload , formData, { headers: { 'Content-Type': 'multipart/form-data' } });

рдкрд░рд┐рдгрд╛рдо:

screen shot 2018-03-27 at 2 02 11 pm

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рджреЗрд╡ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдбреЗрдЯрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рднреЗрдЬрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЕрдВрджрд░ рдореЗрд░рд╛ $ рдЕрдиреБрд░реЛрдз-> рдлрд╝рд╛рдЗрд▓ ('рдлрд╝рд╛рдЗрд▓') рдЦрд╛рд▓реА рд╣реИ
рдореЗрд░рд╛ рдШрдЯрдХ

рдлрд╛рд░реНрдо рдЬрдорд╛ рдХрд░реЗрдВ() {
this.formData = рдирдпрд╛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ ();
this.formData.append('file',this.$refs.file.files[0]);
this.formData.append('analysis',this.analyticsForm.analysis);
this.formData.append('_method','PATCH');
axios.post('/analytics',
рдпрд╣.рдлреЙрд░реНрдордбреЗрдЯрд╛
, {рд╣реЗрдбрд░: {'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': 'рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛'}})ред рддрдм (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ => рдпрд╣ред рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ (рдЧрд▓рдд,'/рд╕реНрд░реЛрдд/'+рдпрд╣.рд╕реНрд░реЛрдд+'/рд╡рд┐рд╡рд░рдг'+'') )
рдХреИрдЪ ((рддреНрд░реБрдЯрд┐) => рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рддреНрд░реБрдЯрд┐))
},

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд░рдирд╛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдПрдорд╡реАрд╕реА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЛ multipart/form-data рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЬрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рддреЛ рдпрд╣ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд░рд╣рд╛ рдерд╛ if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ Microsoft рд╕рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреА рд╣реИ: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 2

рдореЗрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмреЗрд╕ 64 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдерд╛:
https://stackoverflow.com/questions/37134433/convert-input-file-to-byte-array/49676679#49676679

рдпрд╣ рдкреЛрд╕реНрдЯ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдбреНрд░реЙрдкрдЬрд╝реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛:
https://stackoverflow.com/questions/32556664/getting-byte-array-through-input-type-file/49660172#49660172

рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдпрд╣рд╛рдВ рдмрддрд╛рддрд╛ рд╣реВрдВ: https://stackoverflow.com/questions/47574218/converting-from-blob-to-binary-to-save-it-to-mongodb/49660839#49660839

рддрдм рдореИрдВ рдПрдХ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рдерд╛:

const myObj = {
   file = myBase64String,
   title = "myfileTitle.jpg"`
   type = "image/jpeg"`
}

Axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдЕрднреА XMLHttpRequest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

 const xhr = new XMLHttpRequest();

рдФрд░ рд╣реЗрдбрд░ рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:

 xhr.open('POST', '/api/FileUpload/Post', true);
 xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8' );
 xhr.withCredentials = true;

рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП onreadystatechange рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ:

xhr.onreadystatechange = (response) =>
    if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(response.target.responseText);
    }
}

рдФрд░ рднреЗрдЬ рджреЗрдВ:

 xhr.send(JSON.stringify(myObj));

рдпрджрд┐ рдЖрдк axios рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рд╣реЛрдЧрд╛:

try {
    var axios = require('axios');
    const config = {
        headers: {
            'Content-Type': 'application/json;charset=UTF-8',
        }
    }
    await axios.post('https://example.com/api/upload/post', myObj, config)
        .then(function (response) {
             console.log(response);
         })
         .catch(function (error) {
             console.log(error);
         });
}
catch(e) { console.log(e); }

рдПрдорд╡реАрд╕реА рдкрдХреНрд╖ рдкрд░, рдЖрдкрдХреЛ рдПрдХ рдорд┐рд▓рд╛рди рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

public class MyModel {
    public string file { get; set; }
    public string title { get; set; }
    public string type { get; set; }
}

рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ [FromBody] рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯ рдХреЙрд▓ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВ:

[System.Web.Http.HttpPost]
public virtual JsonResult<string> Post([FromBody]MyModel myModelObject)
{
    string strBase64FileString = myModelObject.file;
    string strTitle = myModelObject.title;
    string strFileType = myModelObject.type;

    return Json(JsonConvert.SerializeObject(new { file = myModelObject.file, title = myModelObject.title, myModelObject.type }));
}

рдЖрдкрдиреЗ рдЬреЛ рднреЗрдЬрд╛ рд╣реИ рд╡рд╣ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдорд┐рд▓ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдмрд╣реБрдд рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░/рдореЗрдореЛрд░реА рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред

@navyjax2
рдореИрдВ рд╡реИрд╕рд╛ рд╣реА рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛, рдпрд╣ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ (> 250Mo) рднреЗрдЬрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдФрд░ рд╣рд╛рдБ рдпрд╣ рдореЗрд░реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓реЙрдХ рдХрд░ рд░рд╣рд╛ рдерд╛

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

рдореИрдВ @epferrari рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдХреНрд░реЛрдо рдореЗрдВ рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рдмреЗрд╕ 64 рд╕реНрдЯреНрд░рд┐рдВрдЧ рднреЗрдЬрдирд╛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдиреЛрдб рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (v8.9.3)ред
рдФрд░ рдпрд╣ рдиреЛрдб-рд▓рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...

const fetch = require('node-fetch')
const axios = require('axios')
const FormData = require('form-data')
const base64Img = require('base64-img')

const b64 = base64Img.base64Sync('./test.jpg').split('base64,')[1]
const form = new FormData()
form.append('b64_data', b64)
const headers = form.getHeaders()

// with node-fetch it worked
fetch('http://some.url', {
  method: 'POST',
  body: form,
  headers,
}).then(res => res.text()).then(console.log).catch(console.log)

// not working with axios
axios({
  method: 'POST',
  url: 'http://some.url',
  data: form,
  headers,
}).then(console.log).catch(console.log)

=== рдЕрджреНрдпрддрди ===
рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛, рдореИрдВ рдиреЛрдб-рдлрд╝реЗрдЪ рдФрд░ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╣реА рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдкреЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ?
рд╡реИрд╕реЗ, рдЕрд╕рд▓реА рдпреВрдЖрд░рдПрд▓ рдЬреЛ рдореИрдВ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдореИрдВ рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ http рдЕрдиреБрд░реЛрдз рдХреЛ рдиреЛрдбрдЬ рдХреЗ рд╕рд╛рде рдирдХрд▓реА рд╣реИ, рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдЫрд╡рд┐ рднреЗрдЬрдиреЗ рдФрд░ рдПрдХ рд▓рд┐рдВрдХ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛:

<input onChange="emitImageInfo(this)" type="file" multiple>

function emitImageInfo($event){
  let files = $event.target.files
  let formData = new FormData();

  for (let i = 0; i < files.length; i++)
      formData.append('image[' + i + ']', files[i])

  axios.post('file/upload', formData)
     .then((result) => { console.log('got it') })
     .catch((err) => { console.log(err) })
}

рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛:

axios.post (рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 3000/рдЖрдЗрдЯрдо, рдлреЙрд░реНрдордбрд╛рдЯрд╛, {рд╣реЗрдбрд░: {'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': 'рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛'}});

рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

рдЧреЛрд▓рд╛рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛

Vue рдореЗрдВ рдмрд╕ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЦреЛрдЬреЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредЁЯША
рдмреИрдХ-рдПрдВрдб: рдПрдХреНрд╕рдкреНрд░реЗрд╕.рдЬреЗрдПрд╕ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рдлрд╛рдЗрд▓рдЕрдкрд▓реЛрдб рдкреИрдХреЗрдЬред

<template>
  <div>
    <input type="file"
           name=""
           id="file-upload"
           multiple
           @change="filesChange($event.target.files)">
    <button @click="handleSubmit">Send</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      formData: new FormData(),
    };
  },
  methods: {
    filesChange(fileList) {
      // First: append file to FormData
      Array.from(Array(fileList.length).keys()).map(x => {
        this.formData.append(fileList[x].name, fileList[x]);
      });
    },
    handleSubmit() {
      // Append Text
      this.formData.append('username', 'Jeremy');

      // Append Number: Will be string
      this.formData.append('number', 9527);

      // Append Array: Need to be converted to a string
      this.formData.append('arrData', JSON.stringify([1, 2, 3]));

      // Append Array: Need to be converted to a string
      this.formData.append(
        'objData',
        JSON.stringify({ name: 'Jeremy', age: 28 })
      );

      this.axios({
        method: 'post',
        url: `file/multi-users`,
        data: this.formData,
      }).then(res => {
        console.log(res);
      });
    },
  },
};
</script>

capture

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдо рднреА рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рдереЗред рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред рдЬрдм рдЖрдк рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рдереЗ рддреЛ рдкрд╣рд▓реЗ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рдереА

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрд░реЗ рдЕрдВрдд рдореЗрдВ рдореБрджреНрджрд╛ рдерд╛ред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рд╡рд╣реА рдореБрджреНрджрд╛ред @nickuraltsev рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рдЬреЛрд░рджрд╛рд░ рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ axios рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдиреЛрдб рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

let ff = new FileReader();
ff.onload = (ev) => {
      var result = ev.target.result;
      console.log(`result: ${result} of type ${typeof(result)}`);
      axios.post('/test', {
                 file: result
                 })
                 .then((response) => {
                         console.log(`Response: ${response}`)
                  })
                  .catch((err) => {
                        console.log(`Test error: ${err}`);
                   })
}

var sampleFile = //getting the file here
ff.readAsArrayBuffer(sampleFile);

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреБрд░реЛрдз рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд╛рд▓реА рд╣реИ

рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдРрд░реЗрдмрдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдирд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдирд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреЗрд▓реЛрдб рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ) рдФрд░ рд╕рднреА 3 рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рджреЛ рд╕рд╛рд▓ рдмрд╛рдж:
рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛...

@ demeter-macik рдзрдиреНрдпрд╡рд╛рдж, рд╕реАрдорд╛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рд╣реБрдЖ: рдореБрд╕реНрдХрд╛рди:

    const form = new FormData();
    form.append('email', '[email protected]');
    form.append('phone_no', '63');
    form.append('phone_code', '9179303100');

    if (logo) {
      form.append('logo', logo);
    }

    const response = await axios({
      method: 'post',
      url: `${apiUrl}users`,
      data: form,
      headers: {
        'content-type': `multipart/form-data; boundary=${form._boundary}`,
      },
    });

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ - рд╕рдлрд╛рд░реА рдЖрдИрдУрдПрд╕ рд╕рд╣рд┐рдд рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ред

рдореЗрд░рд╛ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

рдлрд╝рдВрдХреНрд╢рди рдирдореВрдирд╛рдкреЛрд╕реНрдЯ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди) {

// save reference this

let that = this;



// can optionally pull in form fields from an existing HTML form)

let myForm = document.getElementById('myForm');

let myFormData = new FormData(myForm);



// add in data from config.data if applicable

if (config && config.data) {

    that.objToStr(config.data, '', myFormData);



    for (let n2 in config.data) {

        if (config.data.hasOwnProperty(n2)) {

            myFormData.set(n2, config.data[n2]);

        }

    }

}



if (config.binaryFiles && config.binaryFiles.length > 0) {



    for (let i = 0; i < config.binaryFiles.length; i = i + 1) {

        let thisFile = config.binaryFiles[i];

        myFormData.append(thisFile.fieldName, thisFile.binaryData, thisFile.fileName)

    }

}





let axiosConfig = {

    method: 'post',

    url: config.url,

    data: myFormData,



    onUploadProgress: config.onUploadProgress,

};



if (config && config.binaryFiles && config.binaryFiles.length > 0) {

    axiosConfig.headers = {'Content-Type': 'multipart/form-data'};

}

else {

    axiosConfig.headers = {'Content-Type': 'application/x-www-form-urlencoded'};

}



const ax = axios.create();

// note that passing in config to the constructor is broken as of axios v0.19.0-beta.1

// So we work around by passing in config to the request() method



ax.request(axiosConfig)

    .then(function (response) {

        // handle success



        alert(response.data);



    })

};

// рдХреЙрд▓ рдирдореВрдирд╛рдкреЛрд╕реНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдирдореВрдирд╛рдкреЛрд╕реНрдЯ({

url: 'async',

data: {somefield: 'some value'}, //note: passes in as form fields



// optionally include array of binary files

binaryFiles: thisFileList

});

рд╕реЗ: рдПрдВрдЯреЛрдирд┐рдпреЛ рд╡рд╛рдЬрд╝рдХреНрд╡реЗрдЬрд╝ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рднреЗрдЬрд╛ рдЧрдпрд╛: рдордВрдЧрд▓рд╡рд╛рд░, рд╕рд┐рддрдВрдмрд░ 11, 2018 рдкреВрд░реНрд╡рд╛рд╣реНрди 11:23
рдкреНрд░рддрд┐: axios/axios [email protected]
рдкреНрд░рддрд┐рд▓рд┐рдкрд┐: DavidRueter [email protected] ; рдЯрд┐рдкреНрдкрдгреА рдЯрд┐рдкреНрдкрдгреА @noreply.github.com
рд╡рд┐рд╖рдп: рдкреБрди: [рдЕрдХреНрд╖реАрдп/рдЕрдХреНрд╖реАрдп] 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░' рдХреЗ рд╕рд╛рде рдПрдХ .post рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛: рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛' (#318)

4 рдШрдВрдЯреЗ рдФрд░ рд╕рдлрд╛рд░реА рд╕реЗ рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдирддреАред рдЕрднреА рднреА рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛... рдХреНрдпрд╛ рдмрдХрд╡рд╛рд╕ рд╣реИ рджреЛрд╕реНрддреЛрдВ ??

рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕рдорд╛рдзрд╛рди рдиреЗ рдореБрдЭрд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ ... :(

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub https://github.com/axios/axios/issues/318#issuecomment-420371510 рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ https://github.com/notifications/unsubscribe-auth/AFbi6JQBv06LTwL4z3HIAlvXAXDyps1- ks5uZ_9wgaJpZM4Ibm_z ред https://github.com/notifications/beacon/AFbi6BSPfwPvNaWPFSdvtLKRYXS1m4uKks5uZ_9wgaJpZM4Ibm_z.gif

рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж @ arvi

рдЯреНрд╡рд┐рд▓рд┐рдУрд╕рдореНрд╕ = рдПрд╕рд┐рдВрдХреНрд╕ (рдХреЛрдбрд┐рдЧреЛ) => {

var рдлреЙрд░реНрдордбрд╛рдЯрд╛ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдлреЙрд░реНрдо-рдбреЗрдЯрд╛');
рд╡рд░ рдПрдлрдПрд╕ = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдПрдлрдПрд╕');

рд╡рд░ рдлреЙрд░реНрдо = рдирдпрд╛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ ();
рдлреЙрд░реНрдо.рдПрдкреЗрдВрдб ('рдЯреВ', '+524772773737');
рдлреЙрд░реНрдо.рдПрдкреЗрдВрдб ('рд╕реЗ', '+737373737');
рдлреЙрд░реНрдо.рдПрдкреЗрдВрдб ('рдмреЙрдбреА', рдХреЛрдбрд┐рдЧреЛ);

рдХреЛрд╢рд┐рд╢ рдХрд░реЛ {
рдЪрд▓реЛ axapi = axios рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ (
{
рдпреВрдЖрд░рдПрд▓: '2010-04-01/рдЦрд╛рддрд╛/AC8aa53c907943af79234414bb725c2cd3/Messages.json',
рдмреЗрд╕рдпреВрдЖрд░рдПрд▓: 'https://api.twilio.com',
рд╢реАрд░реНрд╖рд▓реЗрдЦ: {'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': multipart/form-data; boundary=${form._boundary} ,},
рдбреЗрдЯрд╛: рдлреЙрд░реНрдо,
рдкреНрд░рдорд╛рдгреАрдХрд░рдг: {
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо: 'AC8aa53c907943af79234414bb725c2cd3',
рдкрд╛рд╕рд╡рд░реНрдб: * ,
},
рд╡рд┐рдзрд┐: 'рдкреЛрд╕реНрдЯ',
}
)

} рдХреИрдЪ (рдИ) {рдХрдВрд╕реЛрд▓.рдПрд░рд░ (рдИ)}
}

рдореИрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рднрдЯрдХ тАЛтАЛрд░рд╣рд╛ рд╣реВрдВ рдЕрднреА рднреА рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрд┐рдд рдХрд╛рдордХрд╛рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ....

рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди?

рдореБрдЭреЗ NodeJS 10.11.0 рдФрд░ Axios 0.18.0 (#1892 рджреЗрдЦреЗрдВ) рдореЗрдВ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рд╣реИред рдореИрдВрдиреЗ @arvi рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

let formData = new FormData(document.querySelector('#form'));

axios.post("/api/xxx", formData).then(console.log).catch(console.error)

рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛

let formData = new FormData(document.querySelector('#form'));

axios.post("/api/xxx", {data: formData}).then(console.log).catch(console.error)

рдкреЛрд╕реНрдЯрдбреЗрдЯрд╛ рдкрд░рдо рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдЕрд╡рдЧрдд рд░рд╣реЗрдВ (url , FormData) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ (url, {data: FormData})

beforeAll(function (done) {

          //parse form fields
          var parsefields = function(req,res){
            var form = new formidable.IncomingForm();
            form.parse(req, function (err, fields, files) {
              if (err) res.status(404).json(err)
              else res.status(200).json(fields);
            });  
          }

          router.route('parsefields').post(parsefields)

          //start server
          s = express()
          s.use('/',router)
          s.listen(4000,(err)=>{done(err)})
          done()
        });

        it('should parse and return form fields', function (done) {

          const fd = new FormData()
          fd.append('key','value')

          axios({
            method: 'POST',
            url: 'http://localhost:4000/parsefields',
            data: fd,
            headers : fd.getHeaders(),
          }).then(function (res) {
            expect(res).to.exist
            expect(res.body.key).to.equals('value')
          }).catch(err => {
            expect(err).not.to.exist
          })
          done()

        });
});

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ 404 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░, рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдФрд░ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд▓рд┐рдП рджреБрд░реНрдЬреЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХреЗрд╡рд▓ рд╕рдлрд╛рд░реА рдкрд░ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рдлреЙрд░реНрдордбрд╛рдЯрд╛-рдкреЙрд▓реАрдлрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рдХрд┐рдпрд╛ред рд╕рдлрд╛рд░реА рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ FormData.append() рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдЧрд▓рдд рдерд╛: рдореИрдВ рдмреНрд▓реЙрдм рд╕реЗ рдмрдирд╛рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рд╕рд╣реА рдмреВрдБрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рддреЛ рд╕рднреА рдиреЗ рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛!

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

`` js upload () { let data = new FormData() data.append('file', this.croppedFile) data.append('blob', this.croppedBlob, 'blob.jpeg') axios.post('/api/fp/process/', data, { headers: { 'Accept': рдЯреЗрдХреНрд╕реНрдЯ/рд╕рд╛рджрд╛',
},
})

croppedFile is derived from croppedBlob with this simple code:
   `   return new File([this.cropImg], this.file.name, { type: this.file.type })`

Firefox dev tools show:

------рд╡реЗрдмрдХрд┐рдЯрдлреЙрд░реНрдордмрд╛рдЙрдВрдбреНрд░реАtmInU7WtcHvmgYbc
рд╕рд╛рдордЧреНрд░реА-рд╡рд┐рд╕реНрдерд╛рдкрди: рдкреНрд░рдкрддреНрд░-рдбреЗрдЯрд╛; рдирд╛рдо = "рдмреВрдБрдж"

------рд╡реЗрдмрдХрд┐рдЯрдлреЙрд░реНрдордмрд╛рдЙрдВрдбреНрд░реАtmInU7WtcHvmgYbc
рд╕рд╛рдордЧреНрд░реА-рд╡рд┐рд╕реНрдерд╛рдкрди: рдкреНрд░рдкрддреНрд░-рдбреЗрдЯрд╛; рдирд╛рдо = "рдлрд╝рд╛рдЗрд▓"; рдлрд╝рд╛рдЗрд▓ рдирд╛рдо = "dscn2950.jpg"
рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдЫрд╡рд┐/рдЬреЗрдкреАрдИрдЬреА

рдмреВрдБрдж: http : // рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 8080/9a6446d1-1ca2-4fd3-a6c8-8b36d863c146
------рд╡реЗрдмрдХрд┐рдЯрдлреЙрд░реНрдордмрд╛рдЙрдВрдбреНрд░реАtmInU7WtcHvmgYbc--

```
Mozilla formData.append рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмреНрд▓реЙрдм рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдЬреЛ рдлрдВрд╕ рдЧрдпрд╛ рд╡рд╣ рдпрд╣ рдерд╛ рдХрд┐ рдореЗрд░рд╛ рд╕рд░реНрд╡рд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд░рд╣рд╛ рдерд╛, https://www.npmjs.com/package/multer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣рд╛рдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдХреЛрдб рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЪреНрдЫрд╛ рдерд╛ред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдереА рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдЦреАрдВрдЪ рд░рд╣рд╛ рдерд╛ - рдХреНрд░реЛрдо рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдФрд░ рдЗрд╕рдиреЗ рд╕рдВрдкреВрд░реНрдг рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдлрд╝рд╛рдЗрд▓ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдЦреАрдВрдЪрдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдирдорд╕реНрддреЗ,
рдХреНрд░рд┐рдкреНрдпрд╛ рдореЗрд░рд┐ рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗред

рдкреЛрд╕реНрдЯ https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart HTTP/1.1
рдкреНрд░рд╛рдзрд┐рдХрд░рдг: рд╡рд╛рд╣рдХ [Your_AUTH_TOKEN]
рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдмрд╣реБрдЦрдгреНрдбреАрдп/рд╕рдВрдмрдВрдзрд┐рдд; рд╕реАрдорд╛ = foo_bar_baz
рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ: [NUMBER_OF_BYTES_IN_ENTIRE_REQUEST_BODY]

--foo_bar_baz
рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдПрдкреНрд▓рд┐рдХреЗрд╢рди/рдЬреЗрд╕рди; рд╡рд░реНрдгрд╕реЗрдЯ = UTF-8

{
"рдирд╛рдо": "рдорд╛рдИрдСрдмреНрдЬреЗрдХреНрдЯ"
}

--foo_bar_baz
рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдЫрд╡рд┐/рдЬреЗрдкреАрдИрдЬреА

[рдЬреЗрдкреАрдИрдЬреА_рдбреЗрдЯрд╛]
--foo_bar_baz--

axios рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдШреВрдВрдЯ рдерд╛ред рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЫреЛрдЯреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереАред рдореИрдВрдиреЗ рдбрд┐рд╕реНрдЯрд░реНрдм рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдпрд╛, рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ sth рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛:

formdata.append("selectPaymentType", $scope.extraFields.selectPaymentType);
formdata.append("pickupMethod", $scope.extraFields.selectPickupType);
рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рджреЗрдВ = {
рд╡рд┐рдзрд┐: 'рдкреЛрд╕реНрдЯ',
рдпреВрдЖрд░рдПрд▓: рдмреЗрд╕рдпреВрдЖрд░рдПрд▓ + 'рдСрд░реНрдбрд░',
рдбреЗрдЯрд╛: рдлреЙрд░реНрдордбреЗрдЯрд╛,
рд╢реАрд░реНрд╖рд▓реЗрдЦ: {
'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд,
'рдПрдХреНрд╕-рдПрдХреНрд╕реЗрд╕-рдЯреЛрдХрди': $scope.userToken
}
};
$http (рдЕрдиреБрд░реЛрдз)
рд╕рдлрд▓рддрд╛ (рдлрд╝рдВрдХреНрд╢рди (рдбреА) { })
рддреНрд░реБрдЯрд┐ (рдлрд╝рдВрдХреНрд╢рди () {});

рдкреБрдирд╢реНрдЪ: рдпрд╣ рдЕрдВрд╢ рд╣реИ ... рдореИрдВ рдлрд╛рдЗрд▓реЗрдВ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдлрд╝реАрд▓реНрдб ...

рд╕рд░реНрд╡рд░:

var рдлреЙрд░реНрдо = рдирдпрд╛ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯреАред рдлреЙрд░реНрдо ({uploadDir: './uploads/orders/'});

form.parse(req, function(err,fields, files) {
// рдЖрдкрдХрд╛ рдХреЛрдб рдпрд╣рд╛рдБ
})

рд╣рд╛рдп рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдорджрдж рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ: рдореБрдЭреЗ "рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓реА: рдпрд╣ рдорд╛рди рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред" рдЬрдм рдореИрдВ рднреНрд░реВрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫрд╡рд┐ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ:
handleSubmit = (event) => { event.preventDefault(); //const { category } = this.state; console.log(this.state.file) let formData = new FormData(); formData.append("file",this.state.file); formData.append("name",this.state.name); alert('You Added a new Category Named ' + this.state.file); fetch(`${process.env.REACT_APP_BASE_URL}/category/image`, { method: 'POST', body: formData }).then(res => res.json()).then(err => console.log(err)); } рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдкреНрд░реЙрдкреНрд╕) {
рд╕реБрдкрд░ (рдкреНрд░реЙрдкреНрд╕);

this.state = {

    name: '',
    file: null
  ,
  isLoaded: false,
  isEditMode: false,

}

}
```

рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП, рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред
рдпрджрд┐ рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдиреНрдп рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд░рд╛рдЙрдЯрд░ рдореЗрдВ MULTER рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреЛрд╕реНрдЯ ('/') рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреА рддрд░рд╣ред

рдЕрдкрдиреЗ axios.create рдЬрд╛рдВрдЪреЗрдВ, рдЗрд╕ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЛ "рд╢реАрд░реНрд╖рд▓реЗрдЦ: {}" рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣:
рд╡рд░ рдЙрджрд╛рд╣рд░рдг = axios.create({
рд╢реАрд░реНрд╖рд▓реЗрдЦ: {
// 'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': 'рдПрдкреНрд▓рд┐рдХреЗрд╢рди/x-www-form-urlencoded; charset=UTF-8',
},
// рдЖрдВрдХрдбрд╝реЗ: {},
рдкреИрд░рд╛рдореНрд╕: {}
});

рдЖрдЬ рддрдХ, рдпрд╣ рдиреЛрдбрдЬ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред request-promise рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред

рдиреЛрдбрдЬ рдореЗрдВ рдПрдХреНрд╕рд┐рдпреЛрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 2 рджрд┐рди рдмрд┐рддрд╛рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдиреЛрдбрдЬ рдореЗрдВ рдЕрдиреБрд░реЛрдз-рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ 30 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред

рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рд╣реЗрдбрд░ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрднрд╛рд▓рд╛:

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

const form = new FormData()
form.append('foo', 'bar')

await axios.post('http://myserver', form, { headers: form.getHeaders() })

@ рдЧреВрдЧреНрд░реЛрд╢ рд╣рд╛рдБред рд╣рд╛рдВред рд╣рд╛рдВред

рдЖрдзрд╛ рджрд┐рди рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдЕрдВрдд рдореЗрдВ, headers: form.getHeaders() рдиреЗ рдЪрд╛рд▓ рдЪрд▓реАред

got рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ formData рдФрд░ multipart/form-data рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл _works_ - https://github.com/sindresorhus/got
рдмрдВрдж рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рдЧрд╛рд░ рдирд╣реАрдВ

  const form = new FormData()
  const stream = fs.createReadStream(file.path)

  form.append('file', stream, file.name)

  try {
    await got.post('http://example.com', { body: form })
  } catch (error) {
    next(error)
  }

рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣реИрдВрдбрд▓ рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВ = (рдИ: рдХреЛрдИ рднреА) => {
e.preventDefault ();
рдХреЙрдиреНрд╕реНрдЯ рдбреЗрдЯрд╛ = рдирдпрд╛ рдлреЙрд░реНрдордбрд╛рдЯрд╛ ();
data.append('product_csv', this.state.csvfile);
рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рджреЗрдВ рдЯреЛрдХрди = рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ.рдЧреЗрдЯрдЗрдЯрдо ('рдПрдХреНрд╕реЗрд╕_рдЯреЛрдХрди');
рдЕрдХреНрд╖рддрдВрддреБ
рдкреЛрд╕реНрдЯ ('/ рдЕрдкрд▓реЛрдб', рдбреЗрдЯрд╛,
{рд╣реЗрдбрд░:
{'рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░': 'рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ/рдлреЙрд░реНрдо-рдбреЗрдЯрд╛', рдкреНрд░рд╛рдзрд┐рдХрд░рдг: рдПрдХреНрд╕реЗрд╕рдЯреЛрдХрди}
})
рддрдм (рд░реЗрд╕ => {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ('рд░реЗрд╕', рд░реЗрд╕);
});
};

@ рдЧреВрдЧреНрд░реЛрд╢ рдмреНрд░рд┐рд▓рд┐рдпрдВрдЯ, .getHeaders() рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдХрд┐рддрдиреЗ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдПред рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдФрд░ рдореИрдВрдиреЗ rn-fetch-blob рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдмрд╣реБрдд рдмреБрд░рд╛ :(

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдлреЙрд░реНрдордбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ .getHeaders() рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред "рдорд┐рд▓рд╛" lib рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдЬреЛ рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдпрд╣рд╛рдВ рднреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ https://github.com/form-data/form-data/issues/458 (рдореИрдВ рдиреЛрдб v12 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)

2020 ES6 рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛

рдПрдЪрдЯреАрдПрдордПрд▓ рдореЗрдВ рдлреЙрд░реНрдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореИрдВ рдбреЗрдЯрд╛ рдореЗрдВ рдмрд╛рдзреНрдп рд╣реВрдВ:

рдЖрдВрдХрдбрд╝реЗ:

form: {
   name: 'Joan Cap de porc',
   email: '[email protected]',
   phone: 2323,
   query: 'cap d\ou'
   file: null,
   legal: false
},

рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдкрд░:

async submitForm() {
  const formData = new FormData()
  Object.keys(this.form).forEach((key) => {
    formData.append(key, this.form[key])
  })

  try {
    await this.$axios.post('/ajax/contact/contact-us', formData)
    this.$emit('formSent')
  } catch (err) {
    this.errors.push('form_error')
  }
}

рджреЗрдЦреЗрдВ: https://github.com/axios/axios/issues/789#issuecomment -508114703

рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ multer рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреЙрдбреА-рдкрд╛рд░реНрд╕рд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рдирд╣реАрдВ рд╣реИред

@DespertaWeb рдЬрдм рдХреЛрдИ рдлрд╛рдЗрд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

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

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

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

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

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

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

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