如何从ng-file-upload文件对象中获取二进制数据?

时间:2015-09-24 00:38:28

标签: base64 ng-file-upload

我正在尝试使用ng-file-upload指令在我的角度应用中提供文件上传功能。

我大部分时间都在工作 - 我可以选择多个文件并循环搜索文件名和文件类型。我似乎无法弄清楚每个文件的实际二进制数据存储在文件对象中的位置。

我尝试使用此帖中列出的方法 - AngularJS Upload a file and send it to a DB,但这会导致错误“$ q未定义”。

function create_blob(file) {
    var deferred = $q.defer();
    var reader = new FileReader();
    reader.onload = function () {
        deferred.resolve(reader.result);
    };
    reader.readAsDataURL(file);
    return deferred.promise;
}

然后我尝试了这篇文章中概述的方法 - Send an uploaded image to the server and save it in the server,但我再次遇到错误,读取“dataURI.split不是函数”。

function dataURItoBlob(dataURI) {
    var binary = atob(dataURI.split(',')[1]);
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    var array = [];
    for (var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {
        type: mimeString
    });
}

我正在使用的代码如下:

function create_blob(file) {
    var deferred = $q.defer();
    var reader = new FileReader();
    reader.onload = function () {
        deferred.resolve(reader.result);
    };
    reader.readAsDataURL(file);
    return deferred.promise;
}

function dataURItoBlob(dataURI) {
    var binary = atob(dataURI.split(',')[1]);
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    var array = [];
    for (var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {
        type: mimeString
    });
}

$scope.uploadFiles = function (files) {
    $scope.files = files;
    angular.forEach(files, function (file) {
        if (file && !file.$error) {

            //var reader = new FileReader();
            //console.log(reader.readAsDataURL(file));

            //var binary = create_blob(file);
            var fileBinary = dataURItoBlob(file);

            $http({
                url: root + '/DesktopModules/ServiceProxy/API/NetSuite/InsertCaseFile',
                method: "POST",
                //headers: { 'caseId': id, 'fileName': file.name, fileContent: $.base64.encode(file) }
                headers: { 'caseId': id, 'fileName': file.name, fileContent: fileBinary }
            }).
            success(function (data, status, headers, config) {
                //if (data == true) {
                //    getCase();
                //    $scope.newMessage = "";
                //    //toaster.pop('success', "", "Message succesfully submitted.",0);
                //}
            }).
            error(function (data, status, headers, config) {
            });

            file.upload.progress(function (evt) {
                file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            });
        }
    });
}

我在俯瞰什么?

1 个答案:

答案 0 :(得分:3)

这取决于您的数据库接受文件上传的格式。如果它支持多部分表单数据,那么您可以使用

Upload.upload({file: file, url: my/db/url}).then(...);

如果它接受带有文件二进制文件作为请求内容的帖子请求(如CouchDB,imgur,...)那么你可以做

Upload.http({data: file, url: my/db/url, headers: {'Content-Type': file.type}})...;

如果db只接受json对象,并且你想将文件作为base64数据url存储在数据库中,如this question那么你可以做

Upload.dataUrl(file, true).then(function(dataUrl) {
    $http.post(url, {
              fileBase64DataUrl: dataUrl, 
              fileName: file.name,
              id: uniqueId
    });
})