我是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];
}
我能做什么,如果3(操作失败),那么步骤1 setOutputSteam将取消或不保存文件。
答案 0 :(得分:0)
您获得的结果是预期的,因为outputStream就像一个临时缓冲区。从官方文档:
在请求完成之前用于写入数据的输出流。
默认情况下,数据会累积到一个缓冲区中,该缓冲区会在请求完成时存储到responseData中,并将中间outputStream属性设置为nil。设置outputStream时,数据不会累积到内部缓冲区中,因此,已完成请求的responseData属性将为nil。输出流将在设置后在网络线程runloop中进行调度。
您应该做的是将outputStream生成的文件视为临时文件。在您的成功回调中,您应该将其移动到更永久的位置(并可能将其重命名)。在错误回调中,您只需将其删除即可。
替代方法是根本不设置outputStream并尝试保存responseObject。我不在我的PC ATM上,所以我还不能给你任何有关该解决方案的提示。
以下是与您类似的问题,请注意接受的答案中的评论 - link