我试图通过远程API通过ajax在android中发送创建的照片。我正在使用Camera Picture Background插件。FormData中的Blob为空
照片创建正确,我通过ajax GET
请求获取并将其编码为base64格式。在调试工具中,我可以通过GET
请求日志查看图像本身。
接下来,我分析它的base64成团块,并尝试将其附加到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}
。
Btw。如果我之前尝试console.log
我的blobObj
,我看到它是 blob,它的大小,类型属性和分片方法 - 为什么在追加到FormData
之后变为null?
编辑:
console.log(blobObj);
给出:
Blob {type: "image/jpeg", size: 50778, slice: function}
EDIT2 - 一步一步CODE:
我有网址到本地的形象,让我们假设它存储在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);
}). [...]
});
制作blob像这样'var blob = new Blob([payLoad],{type:'image/png'});' – Viney
我这次得到一个错误:'您上传的文件不是图像或损坏的图像 – mrmnmly
你是如何将这个base64-image转换成blob的?我使用filereader及其readAsArrayBuffer方法作为blob构造函数的第一个参数。和使用文件名可能会帮助像[这里](http://stackoverflow.com/questions/6664967/how-to-give-a-blob-uploaded-as-formdata-a-file-name) – Blauharley