[英]Passing a Cordova camera.getPicture File to AWS S3 (JS SDK)
我试图将由Cordova的相机插件创建的图像传递给Amazon Web Service的S3。
过去,我曾使用HTML File API创建我的S3参数,并能够传递文件对象。 我无法直接链接到您的操作方式,但是此页面上有一个示例,在“示例使用HTML5 File API将磁盘上的文件上传到S3”部分下。
但是此文件尚未由输入元素插入,因此我无法访问诸如files[0]
之类的文件-Cordova返回该文件为base64或可用文件位置。 因此,我试图弄清楚如何使用Cordova信息来复制该操作。
在这里找到我已经解决的解决方案,它导致以下代码:
function onSuccess(imageData) {
window.resolveLocalFileSystemURL(imageData, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(evt) {
var theBody = btoa(evt.target._result);
var 3_params = {
Bucket: 'the-Bucket',
Key: 'the-Key',
ContentType: file.type,
Body: theBody
}
...other S3 SDK code...
};
reader.readAsDataURL(file);
}
}
}
此过程有效,但是:
_result
(这是base64),这意味着... 我想做的是发送实际的文件对象,而不是弄乱此base64
。 或者,我将采用更好/更智能/更快的方式来处理从base64到S3的进程。
我能够使用“ JavaScript画布到Blob” polyfill从Base64创建一个Blob,然后将返回的Blob发送到S3。 因为它现在是blob而不是编码字符串,所以我可以在s3 APK中使用getSignedURL来引用图像。
上面的唯一变化是:
var theBody = btoa(evt.target._result);
变
var theBody = window.dataURLtoBlob(evt.target._result);
对于那些发现此问题的人,有更好的方法,因为XMLHttpRequest
引入了新功能,现在我们可以使用阅读器和Blob
作为源。
现在可以使用FileReader.readAsArrayBuffer
方法并将Blob
对象作为主体源来编写初始代码:
function onSuccess(imageData) {
window.resolveLocalFileSystemURL(imageData, function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function(evt) {
var blob = new Blob([new Uint8Array(this.result)], { type: file.type });
var 3_params = {
Bucket: 'the-Bucket',
Key: 'the-Key',
ContentType: file.type,
Body: blob
}
...other S3 SDK code...
};
reader.readAsArrayBuffer(file);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.