【问题标题】:How to get binary data from ng-file-upload file object?如何从 ng-file-upload 文件对象中获取二进制数据?
【发布时间】:2015-09-25 06:38:26
【问题描述】:

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

我已经让它大部分工作了 - 我可以选择多个文件并循环获取文件名和文件类型。我似乎无法弄清楚每个文件的实际二进制数据存储在文件对象中的什么位置。

我尝试使用本文中概述的方法 - 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));
            });
        }
    });
}

我忽略了什么?

【问题讨论】:

    标签: base64 ng-file-upload


    【解决方案1】:

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

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

    如果它接受将文件的二进制文件作为请求内容的发布请求(如 CouchDB、imgur 等),那么您可以这样做

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

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

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

    【讨论】:

    • 我正在尝试将文件名、base64 中的二进制数据和唯一 ID 传递给自定义 Web 服务。获取文件二进制内容的base64字符串最直接的方法是什么?
    • 第三种方法。我编辑了答案以显示添加其他字段。
    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多