1

我正在尝试使用 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;
}

所以我尝试了这篇文章中概述的方法 -将上传的图像发送到服务器并将其保存在服务器中,但我再次遇到错误,读取“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));
            });
        }
    });
}

我在看什么?

4

1 回答 1

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 存储在数据库中,那么你可以这样做

Upload.dataUrl(file, true).then(function(dataUrl) {
    $http.post(url, {
              fileBase64DataUrl: dataUrl, 
              fileName: file.name,
              id: uniqueId
    });
})
于 2015-09-24T01:41:01.193 回答