Я пытаюсь отправить созданную фотографию в android через ajax через удаленный API. Я использую плагин Camera Picture Background.Blob in FormData is null
Фото создано правильно, я получаю его через ajax GET
и кодирую его в формате base64. В инструменте отладки я сам вижу изображение через журнал запросов GET
.
Далее я анализирую это base64 для Blob и попытаться присоединить его к FormData
:
var fd = new FormData();
fd.append('photo', blobObj);
$.ajax({
type: 'POST',
url: 'myUrl',
data: fd,
processData: false,
contentType: false
}).done(function(resp){
console.log(resp);
}). [...]
Но когда я посылаю FormData
я вижу в отладчик, который FormData
в запросе равен: {photo: null}
.
КПП. если я попробую console.log
мой blobObj
раньше, я вижу это a blob, с его размером, свойствами типа и методом среза - почему он становится нулевым после добавления к FormData
?
EDIT:
console.log(blobObj);
дает:
Blob {type: "image/jpeg", size: 50778, slice: function}
edit2 - Пошаговый КОД:
У меня есть URL для локального изображения, давайте предположим, что он хранится в imagePath
переменной.
Во-первых, я получаю этот файл и разобрать его в base64:
function base64Encode(){
var CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/";
var out = "", i = 0, len = str.length, c1, c2, c3;
while (i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if (i == len) {
out += CHARS.charAt(c1 >> 2);
out += CHARS.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if (i == len) {
out += CHARS.charAt(c1 >> 2);
RS.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += CHARS.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += CHARS.charAt(c1 >> 2);
out += CHARS.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += CHARS.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
out += CHARS.charAt(c3 & 0x3F);
}
return out;
}
function getFile(fileData){
var dfd = new $.Deferred();
$.ajax({
type: 'GET',
url: fileData,
mimeType: "image/jpeg; charset=x-user-defined"
}).done(function(resp){
var file = base64Encode(resp);
dfd.resolve(file);
}).fail(function(err){
console.warn('err', err);
dfd.resolve();
});
return dfd.promise();
};
$.when(getFile(imagePath)).then(function(resp){
var fd = new FormData();
resp = 'data:image/jpeg;base64,' + resp;
var imgBlob = new Blob([resp], {type : 'image/jpeg'});
fd.append('photo', img, 'my_image.jpg');
$.ajax({
type: 'POST',
url: 'myUrlToUploadFiles',
data: fd,
processData: false,
contentType: false
}).done(function(resp){
console.log(resp);
}). [...]
});
Make blob как this 'var blob = new Blob ([payLoad], {type: 'image/png'});' – Viney
На этот раз я получаю сообщение об ошибке: 'Загруженный вами файл был либо не изображение или поврежденное изображение. – mrmnmly
Как вы преобразовали это base64-изображение в blob?Я использую filereader и его метод readAsArrayBuffer как первый параметр для конструктора blob. И использование имени файла может также помочь [здесь] (http://stackoverflow.com/questions/6664967/how-to-give-a-blob-uploaded-as-formdata-a-file-name) – Blauharley