Cordova - Ler imagem grande corrompe a imagem
Estou usando o seletor de imagens (cordova-imagePicker) para obter imagens da galeria e enviá-las para um servidor.
Estou usando o Cordova 6.1.1 com plataforma Android 5.1.1 e os seguintes plugins:
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"
Como retorno de chamada para o plug-in, estou convertendo o caminho que chego a um arquivo usando o código a seguir. Note que eu usoresolveFile
porque esse código está sendo executado também na área de trabalho, nesse caso, a entrada já é um objeto 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);
}
};
Por sua vez, isso é usado para ler a imagem e passá-la para uma função que a carrega no servidor ($files
é o que estou obtendo do plug-in ou da entrada no caso do desktop / navegador):
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++;
};
Acima, o onload corta os dados da imagem (após 'base64,' na cadeia de caracteres) e os envia para o código de upload que espera uma cadeia de base64 e faz o upload dos dados para o servidor usando uma simples chamada 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);
});
A última função também funciona com o plugin da câmeraplugin da câmera usandoDATA_URI
target (eu sei, não é recomendado), que também retorna uma string base64 (para que eu possa reutilizar o código).
Parece-me que há algo errado com a saída do leitor de arquivos (suponho). O que (eu acho) sugere que é que as imagens pequenas (10s kb) são carregadas muito bem, bem como a sequência base64 já preparada a partir do plug-in da câmera, mas imagens maiores (poucos MBs) que passam pelo leitor de arquivos (no Android, na área de trabalho, tudo bem ) são carregados corrompidos (veja abaixo).
Alguém já teve esses problemas? Alguém pode sugerir uma correção (além de alterar o código para usar o plugin FileTransfer)?
A imagem original:
A imagem carregada (corrompida). Observe que algumas delas são lidas / carregadas corretamente: