使用签名 URL 从 iOS 发布到 S3 超时

Bjo*_*che 5 post amazon-s3 ios afhttpclient afhttprequestoperation

我的服务器正在生成签名上传到 S3 的信息。当我将该信息传递到 iOS 时,它适用于小文件。有时它也适用于较大的,但经常会超时。我目前正在通过 WIFI 在 iOS 7 上进行测试。对于大约 35 MB 的文件,它通常会在大约 60% 后超时,但有时它会完成,有时会更快超时。

我的服务器生成以下信息,我将其作为表单部分传递给我的 POST。(我也尝试过将其作为参数,结果类似):

  • AWS访问密钥ID
  • 内容类型
  • acl(设置为私有)
  • 钥匙
  • 政策
  • 签名
  • 成功_操作_重定向

以及一个 URL。

这是我生成上传的代码:

AFHTTPRequestOperation *op = [manager POST:url
                                parameters:nil
                 constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
          {
              if( throttle )
                  [formData throttleBandwidthWithPacketSize:kAFUploadStream3GSuggestedPacketSize delay:kAFUploadStream3GSuggestedDelay];
              for( id key in parameters ) {
                  NSString *val = parameters[key];                      
                  [formData appendPartWithFormData:[val dataUsingEncoding:NSUTF8StringEncoding] name:key];
              }
              NSError *error;
              if( ![formData appendPartWithFileURL:videoUrl name:@"file" fileName:@"movie.mov" mimeType:@"video/quicktime" error:&error] ) {
                  // handle the error
              }

          } success:^(AFHTTPRequestOperation *operation, id responseObject) {
              //success
          }
               failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                   if( error.code == -1021 && !throttle ) {
                       //try again with throttle:

                   }
                   NSLog(@"Error: %@", error);
                   // handle error
               }];
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

Error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x1aa15130 {NSErrorFailingURLStringKey=XXX, NSErrorFailingURLKey=XXX, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x1ab94290 "The request timed out."}
Run Code Online (Sandbox Code Playgroud)

更新:

我应该提到几个类似的问题。很多人都遇到 Heroku 超时问题,但我直接上传到 S3。

此人似乎在上传到自己的服务器时遇到同样的问题: -使用 AFNetworking 在 iOS 上上传大文件 - 错误请求超时

这个问题看起来像使用AWS库的类似问题,但他们不提供任何代码:

通过 AFNetworking 上传到 Amazon-S3

这个问题似乎相关,但查看源代码,发布文件时似乎考虑了长度:

https://github.com/AFNetworking/AFNetworking/issues/1510#issuecomment-29687300

otu*_*web 0

对于那些最终进入此页面的人。指定的 URL 可能有一个“过期”值,该值对于上传来说太短。我在驯服 AWS 框架以将大文件上传到 iOS 的 S3 中谈到了这一点。查找“CREATE THE PARTS' UPLOAD REQUESTS”,它涵盖了设置该值。我用这种方法上传了 500Mb 的文件。