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

Car*_*spa 3 javascript amazon-s3 cordova

我正在关注Heroku关于直接上传到 Amazon S3的教程。通过 Node.js 应用程序从 AWS 获得签名请求后,他们使用“正常”XMLHttpRequest发送文件。

这是他们的功能:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用 Cordova,由于我没有File从相机插件中获取对象,而只有文件 URI,因此我使用 CordovaFileTransfer将图片上传到我的 Node.js 应用程序,multipart/form-data并且运行良好。

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

这是我所拥有的:

$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);
    });
};
Run Code Online (Sandbox Code Playgroud)

我已经尝试了chunkedMode = trueand chunkedMode = false,但是成功和错误回调都没有被调用。

那么,有没有办法将文件上传到 S3 FileTransfer?我真的需要签名的请求还是只有在我使用 XHR 时才需要?

任何提示表示赞赏。

Car*_*spa 6

我在科尔多瓦结束了这个功能:

$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);
    });
};
Run Code Online (Sandbox Code Playgroud)

重要的位是设置Content-Type标头,因此multipart/form-data不会使用它,并chunkedMode = false通过单个请求发送文件。

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