PhoneGap (Cordova) FileTransfer.upload()가 생성 한 CORS POST 요청을 통해 업로드를 허용하는 데 시간이 너무 많이 걸립니다. 제가 누락 된 부분에 대한 제안은 인정 될 것입니다. 현재 아래 코드를 사용하여 403 AccessDenied 응답을 받고 있습니다. 나는 S3의 문서와 비교해 여러 번 해왔으며 문제를 파악할 수 없다. 여기 Python을 사용하여 Amazon S3 CORS 서명 생성
는 서명 생성 파이썬 코드 :# Create policy document for S3.
policy_obj = {"expiration": "2014-01-01T00:00:00Z",
"conditions": [
{"bucket": "<my.bucket.name>"},
["starts-with", "$key", "story_"],
{"acl": "public-read"},
["eq", "$Content-Type", "audio/mp4"],
["content-length-range", str(0), str(2097152)]
]
}
policy = base64.b64encode(json.dumps(policy_obj))
# Create signature for S3
signature = base64.b64encode(
hmac.new(
key=app.config['AWS_SECRET_KEY'],
msg=policy,
digestmod=hashlib.sha1
).digest()
)
이 프로세스에 의해 생성 된 서명 S3 Signature Tester 의해 생성 된 서명과 일치를 (16 진수로 64 기수 정책 변환하고 함께 서명 테스터를 통해 그 실행 비밀 키).
결과 정책 & 서명
는 클라이언트에 전달하고, S3에 대한 요청이 폰갭 FileTransfer 호출로 내장되어 있습니다 :// Upload file to Amazon S3
// r is the response object generated by Python
var options = new FileUploadOptions();
options.chunkedMode = false;
options.mimeType="audio/mp4";
options.fileKey='file';
options.fileName='story_' + uniqueKey + '.m4a';
options.params={
"key": "${filename}",
"acl": "public-read",
"AWSAccessKeyId": r.aws_access_key,
"Policy": r.policy,
"Signature": r.signature,
};
var ft = new FileTransfer();
ft.upload(path, "http://<my.bucket.name>.s3.amazonaws.com/", uploadSuccess, uploadFail, options);
이것은 CORS 구성 예, 나는 그것을 한 번에 잠글 계획 (이다
{
"Version": "2008-10-17",
"Id": "Policy1356975063803",
"Statement": [
{
"Sid": "Stmt1357234455973",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<my.bucket.name>/*"
},
{
"Sid": "Stmt1356975061658",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::293855469575:root"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::<my.bucket.name>"
}
]
}
:
<?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>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
이 버킷 정책 : 나는 작업 업로드)를 얻을
UPDATE :
이 정책 자체가 파이썬 JSON으로 객체를 변환 한 후 모습입니다 : 당신이 당신의 정책에서 제거 줄 바꿈을 시도
{
"conditions": [
{
"bucket": "<my.bucket.name>"
},
[
"starts-with",
"$key",
"story_"
],
{
"acl": "public-read"
},
[
"eq",
"$Content-Type",
"audio/mp4"
],
[
"content-length-range",
"0",
"6291456"
]
],
"expiration": "2014-01-01T00:00:00Z"
}
다음은 Django의 S3 스크립트입니다. 수행중인 작업과 내가하고있는 작업 사이에 큰 차이가 없음을 알았습니다. (행운과 함께'indent = 2' 매개 변수를 사용해 보았습니다.) http://djangosnippets.org/snippets/2829/ – bjudson