如何在android上的phonegap中从本地文件创建Blob

时间:2013-09-09 15:18:58

标签: javascript android cordova android-webview blob

我正在尝试从android上的phonegap应用程序将文件上传到amazon S3。我已经有了适用于iOS的代码。但是我在安装android时遇到了麻烦。问题是我不知道如何正确创建Blob对象。在iOS上我只是这样做:

blob = new Blob([evt.target.result], {type: "image/png"});

上传得很好。在Android上,我们无法使用Blob构造函数(请参阅here),但我无法使用Blob将文件数据正确地放入WebKitBlobBuilder对象。

以下是我检索文件数据的方法,有两种方法,两种方法都没有错误,但S3上生成的文件为空

window.resolveLocalFileSystemURI(url, function(e){
    e.file(function(f){
        var reader = new FileReader();
        reader.onloadend = function(evt) {
        // This way also did not work:
        //    var builder = new WebKitBlobBuilder();
        //    builder.append(evt.target.result);
        //    blob = builder.getBlob("image/png");

            var blob = null;
            var builder = new WebKitBlobBuilder();
            for(var i = 0; i < evt.target.result.length; i++){
                builder.append(evt.target.result[i]);
            }
            blob = builder.getBlob("image/png");
            uploadToS3(filename, s3url, blob);
        };
        reader.readAsArrayBuffer(f);
    });
}, function(e){
    console.log("error getting file");
    error();
});

另外,这是uploadToS3函数:

var uploadToS3 = function(filename, s3url, fileData) {
    var xhr = createCORSRequest('PUT', s3url);
    if(!xhr) {
        console.log('CORS not supported');
        error();
        return;
    }
    xhr.onload = function () {
        if(xhr.status == 200) {
            console.log('100% - Upload completed.');
            callback(filename); //callback defined in outer context
        }
        else {
            console.log('0% - Upload error: ' + xhr.status);
            console.log(xhr.responseText);
            error();
        }
    };
    xhr.onerror = function () {
        console.log(0, 'XHR error.');
        error();
    };
    xhr.upload.onprogress = function (e) {
        if(e.lengthComputable) {
            var percentLoaded = Math.round((e.loaded / e.total) * 100);
            var label = (percentLoaded == 100) ? 'Finalizing.' : 'Uploading.';
            console.log(percentLoaded + "% - " + label);
        }
    };
    xhr.setRequestHeader('Content-Type', "image/png");
    //xhr.setRequestHeader('x-amz-acl', 'public-read');
    xhr.send(fileData);
};

修改: 我通过记录evt.target.result.byteLength来检查文件大小并且没有问题,因此evt.target.result包含图像数据。仍然存在上传问题 - 我检查了s3存储,文件大小为0,所以我没有正确构建Blob

1 个答案:

答案 0 :(得分:3)

所以这毕竟是一个安卓漏洞,至少从2012年11月开始就没有修复。

以下是我发现的与我的问题直接相关的文章:https://ghinda.net/article/jpeg-blob-ajax-android/

它还为错误提供了一种解决方法,即直接发送ArrayBuffer,而不创建Blob。就我而言,我必须直接发送evt.target.result