Search code examples
phpiosjsonafnetworking-2

Request failed: unacceptable content-type: image/jpg using AFNetworking 2.5


I know this question has already been asked several times in stack overflow. But I am still quite confusing about it. I tried use

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

But I still got the error until I added header("Content-type:application/json"); in my php file. But there is no jason struct in my php file.

My ios side is:

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."];

                                     }
                                 }];

My php side is :

<?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 !";
}

?>

The header("Content-type:application/json"); helps me solve the problem. But I don't know why. And if delete this code, I will always get the the "request failed error". And if I want to receive some info from the php server with the image, which way is the best? Thank you very much for any advise.


Solution

  • Your PHP script sets a Content-type header in the line just below the comment #Main script

    You should remove this and respond with the correct mime-type for your image, image/jpeg (include the 'e'). AFNetworking ships with a response serializer, AFImageResponseSerializer, which will automatically decode a response with Content-type image/jpeg into a 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."];
    
                                         }
                                     }];