2013-02-12 50 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