2013-02-12 47 views
5

我有服務器生成參數,如AWSAccessKeyID,acl,policy,使用POST將文件上傳到S3的簽名,如下所示:http://doc.s3.amazonaws.com/proposals/post.html。 現在有了這些參數,我需要在Amazon服務器上以某種方式運行此請求。似乎我不能使用本機AWS iOS SDK,因爲它的S3客戶端只能使用存儲在服務器上而不是設備上的AWS密鑰和祕密進行初始化。在iOS中上傳Amazon S3 POST

用S3上的所有參數調用此POST請求上傳文件的最佳方式是什麼?或者也許有辦法爲此使用AWS SDK。

+1

在這裏看到:http://stackoverflow.com/questions/5537297/ios-how-to-perform-a-http-post-request – 2013-02-12 17:23:55

+0

謝謝。我認爲我的問題很愚蠢,在問之前我必須考慮。我設法使用AFNetworking上傳文件。 – 2013-02-14 01:45:35

+0

如果別人有同樣的問題,您應該發佈自己的解決方案作爲答案。 – 2013-02-14 02:25:37

回答

18

好吧,如果它可以幫助別人,我設法做這種方式:

NSDictionary* parametersDictionary = @{@"AWSAccessKeyId" : @"YOUR_KEY", 
                @"acl" : @"public-read", // or whatever you need 
                @"key" : @"filename.ext", // file name on server, without leading/
               @"policy" : @"YOUR_POLICY_DOCUMENT_BASE64_ENCODED", 
              @"signature" : @"YOUR_CALCULATED_SIGNATURE" 
            }; 

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString: @"http://s3-bucket.s3.amazonaws.com"]]; 
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" 
                    path:nil 
                   parameters:parametersDictionary 
               constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
                [formData appendPartWithFileData:fileData 
                       name:@"file" //N.B.! To post to S3 name should be "file", not real file name 
                      fileName:@"your_filename" 
                      mimeType:@"mime/type"]; 
               }]; 
AFHTTPRequestOperation* operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

你可以使用任何其他類型的操作一樣AFXMLRequestOperation,如果需要的話,因爲S3以XML格式返回響應。

如果有任何參數丟失或包含無效數據 - 請求將不被接受。

這裏是背景信息的鏈接在此:Browser Uploads to S3 using HTML POST Forms

+0

我無法理解「政策」和「簽名」部分,請您給我一個提示? – 2015-05-08 12:19:14

+0

你檢查了我連接的鏈接嗎?有一張包含所有參數的表格,包括政策和簽名。 – 2015-05-08 16:20:33

+0

雅我讀了感謝它解決了我的問題 – 2015-05-11 05:55:09