Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to put binary file to API via AngularJs $http

I want to upload a binary file (images) to an api which accepts application/octet-stream. Unfortunately it seems angular wants to transform my request, which does not work obviously and results in TypeError: key.charAt is not a function

My request looks like this:

var f = document.getElementById('file_picker').files[0],
r = new FileReader();
r.onloadend = function(e){
    var fileData = e.target.result;
    $http({
        url: '.../upload/' + id,
        method: 'PUT', 
        headers: {'Authorization': 'Bearer asdf',
        'Content-Type': 'application/octet-stream'}, 
        data: new Uint8Array(fileData), 
        transformRequest: []
    })
})
r.readAsArrayBuffer(f);

This is my request via curl which works:

curl -i -X PUT -H "Authorization: Bearer asdf" -H "Content-Type: application/octet-stream" --data-binary @jpg.jpg https://.../upload/123

Any ideas? Thanks.

like image 581
chrjs Avatar asked Jan 05 '17 10:01

chrjs


2 Answers

try this:

            var fd = new FormData();
            fd.append("file", fileObj);

            $http({
                method: "POST",
                params: { 'forcecache': new Date().getTime() },
                url: <yoururl>,
                headers: {
                    "Content-Type": undefined
                },
                transformRequest: angular.identity,
                data: fd
            });

This is a working example on one of our projects. See http://www.uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs/ for more details

like image 186
Verthosa Avatar answered Oct 23 '22 14:10

Verthosa


Working solution:

var file = document.getElementById('file_picker').files[0],
reader = new FileReader();
reader.onload = function() {
    var f = new Uint8Array(reader.result);
    $http({
        url: '...upload/,
        method: 'PUT',
        headers: {'Authorization': 'Bearer asdf',
                'Content-Type' : undefined},
        data: f, 
        transformRequest: [] 
      });
    };
reader.readAsArrayBuffer(file);

The problem is, we have a Data Mapping Interceptor configured, which converts all post and put requests to json. Ouch.

like image 32
chrjs Avatar answered Oct 23 '22 16:10

chrjs