クライアント側でファイルをアップロードしようとしている amazon s3 エンドポイントがあります (バックエンドの助けを借りて)。
これが私のポリシーコードです:
s3Policy = JSON.stringify({
expiration: '2038-12-01T12:00:00.000Z',
conditions: [
["starts-with", "$key", filename],
{ "bucket": bucket },
{ "acl": "public-read" },
["starts-with", "$Content-Type", (fileType || 'application/octet-stream')]
]
})
(この後、base64にエンコードします)
ここに私の角度の要求があります:
var nameData = findExtension(file.name);
$http({
method: 'POST',
url: '/project/' + projectId + '/files/gets3authorization',
data: {
fileType: file.type,
fileExtension: nameData.extension
}
}).then(function(response) {
var s3Data = response.data;
Upload.upload({
url: s3Data.bucketURL,
method: 'POST',
data: {
key: s3Data.savedFileName,
acl: 'public-read',
"Content-Type": (file.type || 'application/octet-stream'),
AWSAccessKeyId: s3Data.key,
headers: { Authorization: undefined },
Policy: s3Data.s3Policy,
Signature: s3Data.s3Signature,
filename: s3Data.savedFileName + '.' + nameData.extension,
file: file
}
}).progress(function(evt) {
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
$scope.log = 'progress: ' + progressPercentage + '% ' +
evt.config.data.file.name + '\n' + $scope.log;
}).success(function(data, status, headers, config) {
$timeout(function() {
$scope.log = 'file: ' + config.data.file.name + ', Response: ' + JSON.stringify(data) + '\n' + $scope.log;
});
}).error(function(err) {
console.log("inner err: ", err)
})
}).catch(function(error) {
console.log('outer err: ', error);
});
私のポリシーは次のようになります (POST が機能し始めたら、セキュリティを強化します)。
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "FileUpload",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my_bucket/files*"
}]
}
これが私のCORS構成です(これも後でセキュリティを強化します):
<?xml version="1.0" encoding="UTF-8" ?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
<ExposeHeader>x-amz-request-id</ExposeHeader>
<ExposeHeader>x-amz-id-2</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
には がResponse Headers
含まれていますが、 には含まれPOST
てAllow
いません。
どんな助けでも大歓迎です。ありがとう!