1

SWFUpload と AWS-SDK を使用して S3 に署名付きの投稿をしようとしています。要するに、それは機能していません。

このように SWFUpload をセットアップしました (coffeescript を許してください)。

@swfu = new SWFUpload
         flash_url: "<%= asset_path 'swfupload.swf' %>"
         file_size_limit: "1000 MB"
         file_types: "*.mp3"
         file_queue_limit:1
         debug: true
         upload_url: "http://<%= configatron.aws.cms.bucket %>.s3.amazonaws.com"
         button_placeholder_id : "SWFUploadButton"
         button_action: SWFUpload.BUTTON_ACTION.SELECT_FILE
         button_width: '112'
         button_height: '33'
         button_text: '<button class="orange-button">Upload MP3s</button>',
         button_cursor : SWFUpload.CURSOR.HAND
         http_success : [201, 303, 200]
         file_post_name: "file"
         file_queued_handler: (data) =>
           @queued(data)

ファイルがキューに入れられると、これが実行されます。

$.ajax
  url: '/uploads/new'
  data: { key: file.name, bucket: '<%= configatron.aws.cms.bucket %>' }
  success: (data) =>
    @upload(data)

/uploads/new最後に、aws-sdk gem を使用して、この行から JSON を返すコントローラーを指します (バケットのインスタンス化について少し省略しました)。

  policy = bucket.presigned_post key: key, success_action_status: 201, acl: 'public-read'
  render json: policy

サンプルの JSON 応答は次のようになります。

{"AWSAccessKeyId":"MY_KEY_ID",
 "key":"blutrotermond.mp3",
 "policy":"base64-encoded-policy",
 "signature":"the-signature",
 "acl":"public-read",
 "success_action_status":"201"}

JavaScript の世界に戻り、署名を用意して、この応答を取得し、パラメータを SWFUpload に追加します。

upload: (data) ->
  @swfu.setPostParams data
  console.log "uploading...."
  @swfu.startUpload()

その後、SWFUpload のコンソールは、Amazon が私の署名プロセスに不満を持っていることを教えてくれます (または、どんな魔法の SWFUpload も、POST 自体が Chrome のインスペクターに表示されず、何が投稿されているかを直接見ることを拒否することを意味するため、私は推測します):

SWF DEBUG: Event: fileQueued : File ID: SWFUpload_0_0
SWF DEBUG: Event: fileDialogComplete : Finished processing selected files. Files selected: 1. Files Queued: 1
SWF DEBUG: StartUpload: First file in queue
SWF DEBUG: Event: uploadStart : File ID: SWFUpload_0_0
SWF DEBUG: Global Post Item: signature=signature
SWF DEBUG: Global Post Item: acl=public-read
SWF DEBUG: Global Post Item: AWSAccessKeyId=MY_KEY_ID
SWF DEBUG: Global Post Item: key=blutrotermond.mp3
SWF DEBUG: Global Post Item: success_action_status=201
SWF DEBUG: Global Post Item: policy=MY_ENCODED_POLICY
SWF DEBUG: ReturnUploadStart(): File accepted by startUpload event and readied for upload.  Starting upload to http://my-bucket.s3.amazonaws.com for File ID: SWFUpload_0_0
SWF DEBUG: Event: uploadProgress (OPEN): File ID: SWFUpload_0_0
SWF DEBUG: Event: uploadProgress: File ID: SWFUpload_0_0. Bytes: 490792. Total: 2167327
SWF DEBUG: Event: uploadProgress: File ID: SWFUpload_0_0. Bytes: 2167327. Total: 2167327
SWF DEBUG: Event: uploadError: HTTP ERROR : File ID: SWFUpload_0_0. HTTP Status: 403.
SWF DEBUG: Event: uploadComplete : Upload cycle complete.

私は AWS-SDK の本質に取り掛かりました。これがポリシーとは何か、署名されているものです。それは私には正しいようです。

{"expiration":"2012-05-02T19:33:31Z",
 "conditions":[{"bucket":"my-bucket"},
               {"key":"blutrotermond.mp3"},
               {"acl":"public-read"},
               {"success_action_status":"201"}]}

したがって、これをさらにデバッグする方法がわかりません。SWFUpload は私から何かを隠しており、投稿パラメーター/署名の何が問題なのかわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

0

答えは、Flashがすべての投稿のアップロードにフィールドを追加し、投稿に署名されたパラメーターを調整する必要があるということでした。このフィールドのサポートをaws-sdkgemとvoilaに追加しました。

デバッグの場合、aws-sdkがスローする例外をもう少し詳しく調べることで、AWSからエラーレスポンスを取得することができます。実際のNet::HTTP応答はどこかにあり、例外メッセージ自体が飲み込んでいるという説明的なエラーメッセージが含まれていました。

これのサポートをに追加したコード、および投稿パラメーターに追加するフィールドの簡単な例については、https://github.com/amazonwebservices/aws-sdk-for-ruby/pull/43を参照してください。aws-sdk

于 2012-06-18T16:10:45.470 に答える
0

WireSharkを使用して Amazon レスポンスをデバッグできます。

私が最初に見たのは、「x-amz-meta-uuid」パラメーターが Amazon に投稿されていないことです。このPHP の例を確認して、Ruby に移植できます。実際、私は .NET で行いましたが、完璧に動作します。

于 2012-06-16T08:57:38.927 に答える