【发布时间】:2017-05-14 21:35:37
【问题描述】:
我正在尝试通过远程 API 通过 ajax 在 android 中发送创建的照片。我正在使用Camera Picture Background 插件。
照片已正确创建,我通过 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,我看到它是 一个blob,具有它的大小、类型属性和切片方法 - 为什么它在附加到FormData 后变为空?
编辑:
console.log(blobObj); 给出:
Blob {type: "image/jpeg", size: 50778, slice: function}
EDIT2 - 逐步代码:
我有本地图片的 url,假设它存储在 imagePath 变量中。
首先,我得到这个文件并将其解析为base64:
function base64Encode(){
var CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
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'}); -
这次我遇到了一个错误:
The file you uploaded was either not an image or a corrupted image -
您是如何将此 base64 图像转换为 blob 的?我使用 filereader 及其 readAsArrayBuffer 方法作为 blob 构造函数的第一个参数。并且使用文件名可能会有所帮助,例如here
-
好的,对不起,我使用 filereader 处理基于 url 的图像,因为应该使用 base64 字符串 atob,它需要一个 base64 字符串并将其直接转换为 blob。 reference。如果我是你,我会使用 filereader 的 readAsDataURL 或 canvas 的 todataurl 将图像转换为 base64 图像。
-
然后我会使用 filereader 及其 readasdataurl 方法,这样您就不需要 ajax 调用和有关其尺寸的知识。这个 base64 是由于 onload 出来的,你可以使用 atob 转换成 blob。
标签: javascript ajax cordova multipartform-data form-data