如何使用Cordova FileTransfer将文件上传到Amazon S3?

时间:2015-07-12 00:17:29

标签: javascript cordova amazon-s3

关于直接上传到Amazon S3的Heroku's tutorial之后。 通过Node.js应用程序从AWS获得签名请求后,他们使用&#34; normal&#34; class Room { val room = generate def generate: Array[Char] = { var temp = Array[Char](10, 10) for (i: Int <- 0 to temp.length; j: Int <- 0 to temp.length) { if (i == 0 || j == 0 || i == temp.length-1 || j == temp.length-1) temp(i, j) = '#' } return temp } def print: Unit = { for (i <- 0 to 10) { var line: String = "" for (j <- 0 to 10) { line += room(i, j) } println(line) } } } 发送文件。

这是他们的功能:

XMLHttpRequest

现在,我正在与Cordova合作,因为我没有从相机插件中获取function upload_file(file, signed_request, url){ var xhr = new XMLHttpRequest(); xhr.open("PUT", signed_request); xhr.setRequestHeader('x-amz-acl', 'public-read'); xhr.onload = function() { if (xhr.status === 200) { document.getElementById("preview").src = url; document.getElementById("avatar_url").value = url; } }; xhr.onerror = function() { alert("Could not upload file."); }; xhr.send(file); } 对象,只有文件URI,我使用了Cordova&#39; {{ 3}}使用File将图片上传到我的Node.js应用程序,并且工作正常。

但是,我无法使其适用于Amazon S3。

以下是我所拥有的:

multipart/form-data

我已经尝试了$scope.uploadPhoto = function () { $scope.getSignedRequest(function (signedRequest) { if (!signedRequest) return; var options = new FileUploadOptions(); options.fileKey = 'file'; options.httpMethod = 'PUT'; options.mimeType = 'image/jpeg'; options.headers = { 'x-amz-acl': 'public-read' }; options.chunkedMode = false; var ft = new FileTransfer(); ft.upload($scope.photoURI, encodeURI(signedRequest.signed_request), function () { // success }, function () { // error }, options); }); }; chunkedMode = true,但是既没有调用成功也没有调用错误回调。

那么,有没有办法使用chunkedMode = false将文件上传到S3? 我是否真的需要签名请求,或者仅在我使用XHR时才需要它?

任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:4)

我最终在Cordova中使用了这个功能:

$scope.uploadPhoto = function () {
    $scope.getSignedRequest(function (signedRequest) {
        if (!signedRequest)
            return;

        var options = new FileUploadOptions();
        options.chunkedMode = false;
        options.httpMethod = 'PUT';
        options.headers = {
            'Content-Type': 'image/jpeg',
            'X-Amz-Acl': 'public-read'
        };

        var ft = new FileTransfer();
        ft.upload($scope.photoURI, signedRequest.signedUrl, function () {
            $scope.$apply(function () {
                // success
            });
        }, function () {
            $scope.$apply(function () {
                // failure
            });
        }, options);
    });
};

重要位是设置Content-Type标头,因此不会使用multipart/form-datachunkedMode = false只需一个请求即可发送文件。

编辑:删除了对插件代码的更改,事后看来,这些更改是无用的(过时的插件)。

答案 1 :(得分:1)

无法添加评论: 奇怪。使用$ cordovaFileTransfer.upload为我工作。我没有'x-amz-acl':'public-read'标题。另外,我不在签名的URL上使用encodeURI。你能调试吗?看到任何错误?我使用chrome:// inspect和port forwarding连接到我在手机上运行的应用程序,因此我能够调试来自亚马逊的响应。可能是它失败的另一个原因。

相关问题