即使服务器返回错误,AFHTTPRequestOperation也会下载文件

时间:2015-04-10 07:20:40

标签: objective-c file download afhttprequestoperation

我是Objective-c的新用户,我想向服务器发送带有令牌的URL请求以下载文件。如果令牌无效,服务器将返回HTTP 500错误。

但我遇到的一个问题是,即使操作返回错误,文件仍然被创建,但文件的内容是错误消息。 我的期望是当操作得到错误时,不应该创建和下载文件。因为不好的解释而烦恼......

下面是我的代码。

- (void)attemptResourceFileWithToken:(NSString*)token
                            from:(NSString*)url
                              to:(NSString*)targetPath
               completionHandler:(void (^)(NSError*))handler {

//create an NSURL object, which is used to make an NSURLRequest.
NSString *string = [NSString stringWithFormat:@"%@&token=%@", url, token];
NSURL *requestUrl = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:requestUrl];
DLog(@"Request URL: %@", requestUrl);

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:targetPath append:NO]];
DLog(@"Target file path: %@", targetPath);

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    DLog(@"Successfully get the response from server");
    handler(nil);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    DLog(@"ERR: %@", [error description]);
    handler(error);
}];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    DLog(@"Downloading %ld of %lld bytes", (long) totalBytesRead, totalBytesExpectedToRead);
}];

[operation start];

}

  1. setOutputStream会将文件保存到目标路径。
  2. 如果操作成功完成,则处理程序返回nil
  3. 如果操作失败,则返回错误。
  4. 我能做什么,如果3(操作失败),那么步骤1 setOutputSteam将取消或不保存文件。

1 个答案:

答案 0 :(得分:0)

您获得的结果是预期的,因为outputStream就像一个临时缓冲区。从官方文档:

  

在请求完成之前用于写入数据的输出流。

     

默认情况下,数据会累积到一个缓冲区中,该缓冲区会在请求完成时存储到responseData中,并将中间outputStream属性设置为nil。设置outputStream时,数据不会累积到内部缓冲区中,因此,已完成请求的responseData属性将为nil。输出流将在设置后在网络线程runloop中进行调度。

您应该做的是将outputStream生成的文件视为临时文件。在您的成功回调中,您应该将其移动到更永久的位置(并可能将其重命名)。在错误回调中,您只需将其删除即可。

替代方法是根本不设置outputStream并尝试保存responseObject。我不在我的PC ATM上,所以我还不能给你任何有关该解决方案的提示。

以下是与您类似的问题,请注意接受的答案中的评论 - link