我正在尝试使用Cordova相机插件来拍摄照片。在拍摄照片后,我创建了一个新的FormData对象来附加图像。我将相机创建的Base64图像转换为Blob,然后将其附加到新的FormData对象。不幸的是,Blob从未被附加。
我有一个Nexus 5运行Android 5.1.1。我使用Cordova 5.1.1和CordovaLib 4.0.2构建了一个应用程序。我安装了以下插件:
cordova插件设备cordova插件应用程序浏览器cordova插件相机cordova插件文件cordova插件文件传输cordova插件白名单
同样的问题也发生在Cordova 4.3.1和CordovaLib android 3.7.2上。
下面是我用来激活设备摄像头的代码片段。
navigator.camera.getPicture(
onSuccess,
onFailure,
{
quality: 50,
destinationType: Camera.DestinationType.DATA_URL,
cameraDirection: Camera.Direction.FRONT
}
);
以下是成功和失败函数。
function onSuccess(URI) {
var the_file = new Blob([window.atob(URI)], {type: 'image/jpeg', encoding: 'utf-8'});
try {
var fd = new FormData();
fd.append('Filedata', the_file, "selfie.jpg");
} catch (e) {
throw e;
}
console.log(the_file.size);
console.log(the_file.type);
console.log(JSON.stringify(fd));
}
function onFailure(e) {
console.log(e);
}
当我运行这段代码时,我在Android Studio中监控控制台输出。我可以看到_file.size和_file.type是正确的。但是,FormData的“JSON.stringify”显示了一个空Object“{}"。
我知道我应该在Cordova中使用FILE_URL而不是DATA_URL来保存内存,但是我现在只需要调试这个FormData问题。一旦我让这个示例运行起来,那么我将在将我的应用程序投入生产之前重构我的代码以使用FILE_URL。我将重点讨论为什么FormData.append函数对我正在创建的Blob不起作用。
1条答案
按热度按时间kcrjzv8t1#
经过更多的测试,我发现FormData在Cordova 5.1.1中不能按预期工作。我还发现它在Cordova 4.2.3和5.0中不一致。
在cordova中处理从摄像机上传文件的解决方案是使用FileTransfer对象和文件系统。
下面是一个修改过的onSuccess函数,它演示了如何从Camera中提取图像并将其上传到服务器。
需要指出的重要一点是,我们并不使用从Camera发送到onSuccess函数的原始URL,而是从window.resolveLocalFileSystemURL函数返回的FileEntry对象中提取实际的文件系统URL。
不幸的是,FormData的问题没有在我能找到的任何地方被记录。我偶然发现在页面底部的 cordova FileTransfer插件https://github.com/apache/cordova-plugin-file-transfer的向后兼容性说明中有点触及URL与localURL。
FileEntry.toURL()和DirectoryEntry.toURL()返回格式为cdvfile://localhost/persistent/path/to/file的文件系统URL,它可以用来代替download()和upload()方法中的绝对文件路径。
我在使用FileReader打开保存的照片并将其附加到FormData时也遇到了问题。我认为新Cordova中的FormData API存在问题。我也注意到了过去版本中API的不一致性。我的建议是避免使用FormData,并使用上面概述的技术从Cordova的相机或文件系统中获取图像。