AFNetworking - загрузка файла, формат неожиданного сообщения "Raw"
Я в основном пытаюсь загрузить файл, который может быть из PDF в PNG. Я использую AFNetworking 1.x.
Однако я получаю сообщение об ошибке:
NSURL *baseURL = [NSURL URLWithString:@"https://myserver.com/webservices/Services/"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
//NSLog(@"Formatted URL: %@", formattedURL);
//NSMutableURLRequest *photoRequest = [NSMutableURLRequest requestWithURL:url];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[httpClient defaultValueForHeader:@"Accept"];
[httpClient setParameterEncoding:AFFormURLParameterEncoding];
[parameters setObject:[NSNumber numberWithInteger:@"10772"] forKey:@"FileId"];
[parameters setObject:[NSNumber numberWithBool:YES] forKey:@"requireUnCompression"];
NSMutableURLRequest *fileRequest = [httpClient requestWithMethod:@"POST" path:@"FileService.svc/DownloadFile" parameters:parameters];
//[fileRequest setHTTPBody:<#(NSData *)#>]
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:fileRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Successss!");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failed: %@", [operation error]);
}];
[httpClient enqueueHTTPRequestOperation:operation];
Однако я получаю сообщение об ошибке:
Failed: Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 400" UserInfo=0x12112770 {NSLocalizedRecoverySuggestion={"faultType":"InvalidOperationException","message":"The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml', 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details."}, AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest: 0xc865c40> { URL: https://myserver.com/webservice/Services/FileService.svc/DownloadFile }, NSErrorFailingURLKey=https://myserver.com/webservices/Services/FileService.svc/DownloadFile, NSLocalizedDescription=Expected status code in (200-299), got 400, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xc8696a0> { URL: https://myserver.com/webservices/Services/FileService.svc/DownloadFile } { status code: 400, headers {
"Cache-Control" = private;
"Content-Length" = 327;
"Content-Type" = "application/xml; charset=utf-8";
Date = "Thu, 17 Oct 2013 19:45:07 GMT";
"Persistent-Auth" = true;
Server = "Microsoft-IIS/8.0";
"X-AspNet-Version" = "4.0.30319";
"X-Powered-By" = "ASP.NET";
} }}
Заранее спасибо!
1 ответ
Я загружаю PDF-файлы / изображения /WordDocs в свое приложение без AFNetworking, я также столкнулся с проблемами, поэтому я решил просто старый добрый NSURLConnection. Мой NSURLRequest не использует данные POST, но я изменил NSURLRequest здесь для данных POST.
После завершения загрузки файла я предоставляю QLPreviewController для его отображения. (это может обрабатывать отображение PDF-файлов, изображений или документов документов. Для того, чтобы увидеть это, требуется немного больше кода)
Объявите 4 свойства в вашем.h:
@property (strong, nonatomic) NSNumber *reportLength;
@property (strong, nonatomic) NSURLConnection *reportConnection;
@property (strong, nonatomic) NSMutableData *reportData;
@property (strong, nonatomic) NSString *reportURL;
также добавить NSURLConnectionDelegate
в ваш список делегатов
Тогда в.m:
- (void)downloadReport:(NSString *)reqUID
{
NSString *file = [NSString stringWithFormat:@"%@GetReport.ashx?requestUID=%@&deviceUID=%@&token=%@", _globals.baseURL, reqUID, [MySingleton getDeviceID], _globals.token];
NSURL *fileURL = [NSURL URLWithString:file];
NSMutableURLRequest *req = [NSURLRequest requestWithURL:fileURL];
[req setHTTPMethod:@"POST"];
NSString *postString = @"FileID=10772&requireUnCompression=1";
[req setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
_reportConnection = [NSURLConnection connectionWithRequest:req delegate:self];
_reportData = [NSMutableData data];
[_reportConnection start];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[_reportData setLength:0];
NSLog(@"didReceiveResponse %@: %@", [response URL], [(NSHTTPURLResponse*)response allHeaderFields]);
_reportLength = [NSNumber numberWithLongLong:[response expectedContentLength]];
if(_reportLength.longLongValue == 0)
{
[_reportConnection cancel];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Empty Report" message:@"The report you requested is empty. " delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil, nil];
[alert show];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[_reportData length]];
[_reportData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSString *msg = [NSString stringWithFormat:@"Error"];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"There was an issue downloading the attachment. Please try again." message:msg delegate:self cancelButtonTitle:@"Not Now" otherButtonTitles: @"Yes", nil];
[alert show];
}
//when finished save in documents directory
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSArray *dirArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
_reportURL = [NSString stringWithFormat:@"%@/%@", [dirArray objectAtIndex:0], [NSString stringWithFormat:@"%@.pdf", _currentRequestUID]];
NSError *err;
if ([_reportData writeToFile:_reportURL options:NSAtomicWrite error:&err] == NO) {
NSLog(@"writeToFile error: %@", _reportURL);
NSString *msg = [NSString stringWithFormat:@"There was an issue saving the attachment. Please try again."];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
}
else //pdf downloaded, display using QLPreviewController
{
NSLog(@"Written: _reportURL: %@", _reportURL);
QLPreviewController *previewController=[[QLPreviewController alloc]init];
previewController.delegate=self;
previewController.dataSource=self;
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(btnCloseQLTouch:)];
[previewController.navigationItem setLeftBarButtonItems:[NSArray arrayWithObjects:btn, nil]];
[self presentViewController:previewController animated:YES completion:nil];
}
}
РЕДАКТИРОВАТЬ
Чтобы заставить работать QLPreviewController, сначала добавьте <QuickLook.framework>
затем добавьте эти удаления в свой.h:
QLPreviewControllerDataSource, QLPreviewControllerDelegate
Вот методы источника данных / делегата, необходимые для отображения файла:
//quicklook datasource/ delegate
- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
{
return 1;
}
- (id <QLPreviewItem>)previewController: (QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{
return [NSURL fileURLWithPath:_reportURL];
}