Как получить двоичные данные из файлового объекта ng-file-upload?

Я пытаюсь использовать директиву ng-file-upload для обеспечения функции загрузки файлов в моем приложении angular.

У меня это работает по большей части - я могу выбрать несколько файлов и выполнить цикл, чтобы получить имя файла и типы файлов. Я просто не могу понять, где фактические двоичные данные каждого файла хранятся в файловом объекте.

Я попытался использовать подход, описанный в этом сообщении - AngularJS Upload файл и отправить его в БД, но это приводит к ошибке "$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;
}

Итак, я попробовал подход, описанный в этом посте: the-server/32011326#32011326">Отправить загруженное изображение на сервер и сохранить его на сервере, но снова я сталкиваюсь с ошибкой: "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));
            });
        }
    });
}

Что я упускаю из виду?


person GregVP    schedule 24.09.2015    source источник


Ответы (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 и хотите сохранить файл как URL-адрес данных base64 в базе данных, например этот вопрос, тогда вы можете сделать

Upload.dataUrl(file, true).then(function(dataUrl) {
    $http.post(url, {
              fileBase64DataUrl: dataUrl, 
              fileName: file.name,
              id: uniqueId
    });
})
person danial    schedule 24.09.2015
comment
Я пытаюсь передать имя файла, двоичные данные в base64 и уникальный идентификатор пользовательскому веб-сервису. Каков самый прямой способ получить эту строку base64 двоичного содержимого файла? - person GregVP; 24.09.2015
comment
Третий подход. Я отредактировал ответ, чтобы показать добавление других полей. - person danial; 25.09.2015