2013-01-04 2 views
2

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" 
} 
+0

다음은 Django의 S3 스크립트입니다. 수행중인 작업과 내가하고있는 작업 사이에 큰 차이가 없음을 알았습니다. (행운과 함께'indent = 2' 매개 변수를 사용해 보았습니다.) http://djangosnippets.org/snippets/2829/ – bjudson

답변

0

가나요?

다음은 정책의 루비 코드, s3_file_upload의 예의입니다 :

Base64.encode64(policy_data.to_json).gsub("\n", "") 

당신은 내가 같은 일을 할 노력하고있어 으려고 업로드가, 작업 관리 있으면 알려 주시기 바랍니다.

+0

위의 'json.dumps()'함수는 기본적으로 개행하지 않고 정책을 생성합니다. 나는 또한 줄 바꿈 ('indent = 2' 매개 변수 설정)을 사용하여 시도했지만, 공백을'strip()'로 제거하려고 시도했지만 객체에서 json을 생성하는 대신 텍스트 파일에서 정책 문서를로드하려고 시도했습니다. 때마다 403 응답을 얻습니다. 운이 좋았다면 알려주세요. – bjudson