Кордова - чтение большого изображения искажает изображение

Я использую средство выбора изображений (Cordova-imagePicker) плагин для того, чтобы получать изображения из галереи и загружать их на сервер.

Я использую Cordova 6.1.1 с платформой Android 5.1.1 и следующими плагинами:

cordova-plugin-camera 2.2.0 "Camera"
cordova-plugin-compat 1.0.0 "Compat"
cordova-plugin-device 1.0.1 "Device"
cordova-plugin-file 4.2.0 "File"
cordova-plugin-imagepicker 1.1.0 "ImagePicker"
cordova-plugin-inappbrowser 1.4.0 "InAppBrowser"
cordova-plugin-media 2.3.0 "Media"

В качестве обратного вызова к плагину я конвертирую путь к файлу, используя следующий код. Обратите внимание, что я используюresolveFile потому что этот код выполняется также на рабочем столе, в этом случае запись уже является объектом File.

var resolveFile = function(entry) {
    if (typeof(entry) === "string") {
        var deferred = $q.defer();
        // first convert to local file system URL
        window.resolveLocalFileSystemURL(entry, function(fileEntry) {
            // now read/convert the file to file object.
            fileEntry.file(function(file) {
                console.log("File converted to file entry");
                deferred.resolve(file);
            }, function(err) {
                console.log("Failed to convert to file entry", err);
                deferred.reject(err);
            });
        }, function(err) {
            console.log("Failed to resolve to file URL", err);
            deferred.reject(err);
        });

        return deferred.promise;
    } else {
        return $q.when(entry);
    }
};

Это, в свою очередь, используется для чтения изображения и передачи его функции, которая загружает его на сервер ($files это то, что я получаю от плагина или от ввода в случае рабочего стола / браузера):

var upload = function () {
    if (!$files[currentFile]) {
        onAllFinished();
        return;
    }
    file = $files[currentFile];
    beforeLoad(file);
    fileReader = new FileReader();
    fileReader.onload = onload;
    fileReader.onprogress = progress;
    resolveFile(file).then(function(actualFile) {
        fileReader.readAsDataURL(actualFile);
    });
    currentFile++;
};

В приведенном выше примере onload вырезает данные изображения (после 'base64,' в строке) и отправляет их в код загрузки, который ожидает строку base64 и загружает данные на сервер с помощью простого вызова AJAX:

var uploadPhoto = function(url, photo, callback, error)
    $http.post(url, {
        photo: photo,
    })
    .success(callback)
    .error(function (data, status, headers, config) {
        if (error)
            error(data, status, headers, config);
    });

Последняя функция работает также с плагином камерыплагин камеры с помощьюDATA_URI target (я знаю, это не рекомендуется), который также возвращает строку base64 (поэтому я могу повторно использовать код).

Мне кажется, что-то не так происходит с выводом программы чтения файлов (я предполагаю). Что (я думаю) намекает на то, что небольшие изображения (10 с кб) загружаются нормально, а также уже подготовленная строка base64 из плагина камеры, но большие изображения (несколько мегабайт) проходят через программу чтения файлов (на Android, на рабочем столе это нормально ) загружены повреждены (см. ниже).

Кто-нибудь сталкивался с такими проблемами? Кто-нибудь может предложить исправление (кроме изменения кода для использования плагина FileTransfer)?

Исходное изображение:

Загруженное (поврежденное) изображение. Обратите внимание, что некоторые из них отлично читаются / загружаются:

Ответы на вопрос(1)

Ваш ответ на вопрос