Angular上传文件到AWS S3错误412 PreconditionFailed

时间:2016-01-19 14:29:13

标签: angularjs amazon-s3

尝试使用angular将文件上传到AWS S3时出现问题。这是错误结果:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>PreconditionFailed</Code>
    <Message>At least one of the pre-conditions you specified did not hold</Message>
    <Condition>Bucket POST must be of the enclosure-type multipart/form-data</Condition>
    <RequestId>A951A5170520EC7C</RequestId>
    <HostId>geepsSG0zcsNjTRux85V62EARw3E6HWfXWdckd/Uq0Zja+USfsQM7Myi2T3SqdkBcNsAoGF5RVw=</HostId>
</Error>

我的角度代码:

// Handle file input change event.
fileIn.on('change', function ( e ) {
    if ( this.files.length > 0 ) {
        // Get the selected file.
        var file = this.files[ 0 ];

        // Get the S3 Policy and Signature.
        $http({
            method : 'GET',
            url    : 'http://localhost:8091',
            params : {
                file : file.name,
                type : file.type
            }
        }).then(function ( res ) {
            // Upload file
            $http({
                url    : 'https://my-bucket.s3.amazonaws.com/',
                method : 'POST',
                data   : {
                    AWSAccessKeyId : res.data.access,
                    policy         : res.data.policy,
                    signature      : res.data.signature,

                    file     : file,
                    filename : file.name,
                    key      : file.name,

                    acl            : 'public-read',
                    "Content-Type" : file.type != '' ? file.type : 'application/octet-stream',
                }
            }).then(uploadSuccess, uploadFailed, uploadProgress);
        }, function ( err ) {
            AppLogger.toast('error', 'Critical Error!', err.data, {
                type : 'json',
                code : err.data.code
            });
        });
    }
});

我尝试使用ng-file-upload,但错误不同。

为什么会发生错误以及如何解决?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您的错误是&#34; POST必须是机箱类型multipart / form-data&#34;。 看起来file.type不是multipart / form-data。

我建议在你的$ http POST之上,你可以在console.log中找到file.type。 或者只是将内容类型更改为multipart / form-data。你不希望它是用于二进制文件的八位字节流。