isomorphic-fetch icon indicating copy to clipboard operation
isomorphic-fetch copied to clipboard

Post file/blob using multipart formdata ?

Open leplatrem opened this issue 9 years ago • 5 comments

In the browser, if I do something like:

    var headers = {Authorization: "Basic " + btoa("user:pass")};
    // Build form data
    var formData = new FormData();
    // File obtained via File API
    formData.append('attachment', file, file.name);
    // Some data as JSON
    formData.append('data', JSON.stringify({foo: "bar"}));
    // Post using GlobalFetch API
    fetch(url, {method: "POST", body: formData, headers: headers})
      .then(...)

The request issued in the browser will have Content-Type:"multipart/form-data; boundary=---------------------------<random-number> and the body will be like:

-----------------------------<random-number>
Content-Disposition: form-data; name="attachment"; filename="velo.jpg"
Content-Type: image/jpeg

ÿØÿà ....

-----------------------------<random-number>
Content-Disposition: form-data; name="data"

{"foo":"bar"}
-----------------------------<random-number>--

I would also work (from the browser) using blobs:

const blob = new Blob([new Uint8Array(array)], {type: "image/jpeg"});
formData.append('attachment', blob, "velo.jpg");

For our integration tests we're using [email protected] and [email protected] and we can't get obtain the same behavior (content-type and body seem to remain empty). I could not find any existing issue that was specific to multiparts (#30 is about FormData).

Is that something reasonably feasible ? Can we help ?

Thanks a lot!

leplatrem avatar Jul 14 '16 12:07 leplatrem

function upload() {
  const formData = new FormData(document.getElementById('myForm'));
  const headers = {
    'Accept': 'application/json, */*',
    'Content-Type': 'multipart/form-data'
  }
  const init = {
    headers,
    method: 'POST',
    body: formData
  };
  fetch('/upload', init).then(res => console.log(res));
}

I try to POST files by that func, but the 'boundary' is not in request payload. how should i do? below is the request payload:

------WebKitFormBoundary2gPDSneqBnpU2L4v Content-Disposition: form-data; name="files"; filename="fox.jpg" Content-Type: image/jpeg

------WebKitFormBoundary2gPDSneqBnpU2L4v Content-Disposition: form-data; name="path"

/ ------WebKitFormBoundary2gPDSneqBnpU2L4v--

justinjzs avatar Jan 03 '17 10:01 justinjzs

Hey @justinjzs take 'Content-Type' out of the headers. The browser should add it automatically (including the boundary).

gusdaud-zz avatar Jan 11 '17 13:01 gusdaud-zz

@gusdaud @justinjzs @leplatrem Was this issue resolved? boundary is not being passed for me in the request header automatically even after explicitly setting 'Content-Type': 'multipart/form-data' header.

AdarshKonchady avatar Dec 22 '17 18:12 AdarshKonchady

Does anyone have a working example of this?

jsellers180 avatar Jun 09 '18 00:06 jsellers180

@gusdaud's solution worked for me.

This should be closed

jayaramkasi avatar Mar 12 '19 05:03 jayaramkasi