请求失败:不可接受的内容类型:使用 AFNetworking 2.5 的图像/jpg

Posted

技术标签:

【中文标题】请求失败:不可接受的内容类型:使用 AFNetworking 2.5 的图像/jpg【英文标题】:Request failed: unacceptable content-type: image/jpg using AFNetworking 2.5 【发布时间】:2015-01-03 18:12:21 【问题描述】:

我知道这个问题已经在堆栈溢出中被问过好几次了。但我仍然对此感到很困惑。我试过用

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", @"image/jpg", nil];

但在我添加 header("Content-type:application/json"); 之前我仍然收到错误消息在我的 php 文件中。但是我的 php 文件中没有 jason 结构。

我的ios端是:

AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];

NSError *__autoreleasing* error;
// 2. Create an `NSMutableURLRequest`.
NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://192.168.199.118/search.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    [formData appendPartWithFileData:imageData
                                name:@"uploadedfile"
                            fileName:@"image.jpg"
                            mimeType:@"image/jpg"];
 error:(NSError *__autoreleasing *)error];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", @"image/jpg", nil];

AFHTTPRequestOperation *operation =
[manager HTTPRequestOperationWithRequest:request
                                 success:^(AFHTTPRequestOperation *operation, id responseObject) 
                                     NSLog(@"Success %@", responseObject);


                                  failure:^(AFHTTPRequestOperation *operation, NSError *error) 
                                     NSLog(@"Failure %@", error.description);
                                     if (error.code == -1001) 
                                         [self NetworkAlert:@"Resquest timed out. Please try again and check your network connection."];

                                     
                                 ];

我的php端是:

<?php

#function for streaming file to client
function streamFile($location, $filename, $mimeType='image/jpg')
 if(!file_exists($location))
   header ("HTTP/1.0 404 Not Found");
    return;
  

  //header("Content-Type: $mimeType"); 
  header("Content-type:application/json");
  readfile($location);



#**********************************************************
#Main script
#**********************************************************
header("Content-type:application/json");
#<1>set target path for storing photo uploads on the server
$photo_upload_path = "upload/";
$photo_upload_path = $photo_upload_path.basename( $_FILES['uploadedfile']['name']); 
$photo_upload_indicator_path = "upload/image_ready";

#<2>set target path for storing result on the server
$downloadFileName = 'processed_';
$processed_photo_output_path = "output/processed_";
$processed_photo_output_path = $processed_photo_output_path.basename( $_FILES['uploadedfile']['name']); 
$processed_photo_output_indicator_path = "output/result_ready";
$downloadFileName = $downloadFileName.basename( $_FILES['uploadedfile']['name']); 

#<3>modify maximum allowable file size to 10MB and timeout to 300s
ini_set('upload_max_filesize', '10M');  
ini_set('post_max_size', '10M');  
ini_set('max_input_time', 300);  
ini_set('max_execution_time', 300);  

#<4>Get and stored uploaded photos on the server
if(copy($_FILES['uploadedfile']['tmp_name'], $photo_upload_path)) 

    #<5>signal that the image is ready
    $handle = fopen($photo_upload_indicator_path, 'w');
    fprintf($handle, '%s', $photo_upload_path);
    fclose($handle);

    #<6>wait until the result is ready
    while (!file_exists($processed_photo_output_indicator_path))
    
        usleep(1000000);
    
    usleep(1000000);
    unlink($processed_photo_output_indicator_path);

    #<7>stream processed photo to the client
    streamFile($processed_photo_output_path, $downloadFileName,'image/jpg');
 else
    echo "There was an error uploading the file to $photo_upload_path !";


?>

标头("Content-type:application/json");帮助我解决问题。但我不知道为什么。 如果删除此代码,我将始终收到“请求失败错误”。如果我想从带有图像的 php 服务器接收一些信息,哪种方式是最好的?非常感谢您的任何建议。

【问题讨论】:

【参考方案1】:

您的 PHP 脚本在注释 #Main script 正下方的行中设置了一个 Content-type 标头

您应该删除它并使用正确的图像类型作为响应,image/jpeg(包括“e”)。 AFNetworking 附带一个响应序列化器AFImageResponseSerializer,它会自动将 Content-type image/jpeg 的响应解码为 UIImage:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFImageResponseSerializer serializer];

AFHTTPRequestOperation *operation =
[manager HTTPRequestOperationWithRequest:request
                                 success:^(AFHTTPRequestOperation *operation, UIImage *responseImage) 
                                     NSLog(@"Success %@", responseImage);


                                  failure:^(AFHTTPRequestOperation *operation, NSError *error) 
                                     NSLog(@"Failure %@", error.description);
                                     if (error.code == -1001) 
                                         [self NetworkAlert:@"Resquest timed out. Please try again and check your network connection."];

                                     
                                 ];

【讨论】:

以上是关于请求失败:不可接受的内容类型:使用 AFNetworking 2.5 的图像/jpg的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 2.0:NSLocalizedDescription=请求失败:不可接受的内容类型:文本/html

带有文本/纯文本响应的 API 因“不可接受的内容类型”而失败

Swift 项目中的 AFNetorking ——“错误:请求失败:不可接受的内容类型:文本/html”

代码=-1016“请求失败:不可接受的内容类型:文本/纯文本”用户信息=0x7a2da380

AFNetworking 总是返回不可接受的内容类型:text/html

无法使用 AFNetworking 发出 POST 请求