0

我是 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. 如果操作失败,返回错误。

我能做什么,如果 3(操作失败)那么第 1 步 setOutputSteam 将取消或不保存文件。

4

1 回答 1

0

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

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

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

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

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

这是与您的问题类似的问题,请注意已接受答案中的评论-链接

于 2015-04-10T07:44:20.303 回答