使用 AFNetworking 从 S3 获取公共文件并接收 403

Posted

技术标签:

【中文标题】使用 AFNetworking 从 S3 获取公共文件并接收 403【英文标题】:Using AFNetworking to GET public files from S3 and receive 403 【发布时间】:2013-05-13 10:11:07 【问题描述】:

我正在尝试从我们的 S3 存储下载 PDF 文件。这些文件是公开的,可以通过浏览器访问。

使用 AFNetworking 时,我收到 403。代码如下所示

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:self.pdfUrl]];

void (^success)(AFHTTPRequestOperation*, id) = ^(AFHTTPRequestOperation *operation, id responseObject) 

    NSLog(@"WE HAS SUCCESS :D");
;

void (^failure)(AFHTTPRequestOperation*, id) = ^(AFHTTPRequestOperation *operation, id responseObject) 

    NSLog(@"failure :((. OPERATION:\n\n%@ \n\nResponseObject:\n\n%@",operation,responseObject);
;

NSURLRequest *request = [client requestWithMethod:@"GET" path:@"" parameters:nil];
AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure];

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:[TTConstants temporaryFilePath] append:NO];

[client enqueueHTTPRequestOperation:operation];

导致输出:

failure :((. OPERATION:
<AFHTTPRequestOperation: 0x95a2f40, state: isFinished, cancelled: NO request: 
<NSMutableURLRequest https://s3.amazonaws.com/com.turtletail.java-bucket/dbda2ccb-91db-4672-9ad4-288dd313ef8c/pdfnumberone.pdf/>,
response: <NSHTTPURLResponse: 0xa692480>> 

ResponseObject:

Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 403"
UserInfo=0xa6bda40 AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest https://s3.amazonaws.com/com.turtletail.java-bucket/dbda2ccb-91db-4672-9ad4-288dd313ef8c/pdfnumberone.pdf/>,
NSErrorFailingURLKey=https://s3.amazonaws.com/com.turtletail.java-bucket/dbda2ccb-91db-4672-9ad4-288dd313ef8c/pdfnumberone.pdf/,
NSLocalizedDescription=Expected status code in (200-299), got 403,
AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xa692480>

建议会很棒!

【问题讨论】:

我实际上无法在浏览器中查看文件。你确定它和你想的一样可用吗? 是的,我为 SO 更改了 PDF 的名称。也许应该提到这一点。 【参考方案1】:

不要将完整的 PDF URL 用作 AFHTTPClientbaseURL,因为这会导致最终 URL 的末尾有一个额外的 /。而是将baseURL 设置为https://s3.amazonaws.com/com.turtletail.java-bucket/dbda2ccb-91db-4672-9ad4-288dd313ef8c,然后在请求中将路径设置为pdfnumberone.pdf

【讨论】:

以上是关于使用 AFNetworking 从 S3 获取公共文件并接收 403的主要内容,如果未能解决你的问题,请参考以下文章

访问 aws s3 公共存储桶

使用 AFNetworking 发布请求 Amazon S3

拒绝从某些 IP 地址访问公共 S3 存储桶

节点 JS AWS S3 文件上传。如何获取公共 URL 响应

亚马逊 s3 与 AFAmazonS3Manager + AFNetworking

python 获取公共可读的所有S3存储桶名称,如果设置为“私有”