Загрузка изображений в многочастном формате с использованием AFnetworking не работает в IOS

  1. AFHTTPSessionManager используется для публикации файла из приложения ios
  2. Серверная часть реализована с использованием php
  3. Сервер принимает файл, если он отправлен с веб-сервера

Мой код iOS

UIImage *image = [UIImage imageNamed:@"Fb-button"];

NSData *imageData = UIImagePNGRepresentation(image);

AFHTTPSessionManager *sessionManager  = [[AFHTTPSessionManager alloc]initWithBaseURL:@"baseurl"];

AFJSONResponseSerializer *jsonresponseSerilaizer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

jsonresponseSerilaizer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/plain",@"text/html", nil];

sessionManager.responseSerializer = jsonresponseSerilaizer ;

[sessionManager POST:@"pathurl" parameters:Nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

[formData appendPartWithFileData: imageData name:@"userfile" fileName:@"userfile.png" mimeType:@"png"];

} success:^(NSURLSessionDataTask *task, id responseObject) {

NSLog(@"success");

NSLog(@"response : %@",responseObject);

} failure:^(NSURLSessionDataTask *task, NSError *error) {

NSLog(@"error");

NSLog(@"error : %@",error);

}];

Ошибка, которую я получаю в xcode — ошибка какао 3840

error : Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid value around character 0.) UserInfo=0x79865f70 {NSDebugDescription=Invalid value around character 0., NSUnderlyingError=0x798665c0 "Request failed: bad request (400)"}

Код PHP приведен ниже

$user_image              =   $_FILES['user_image']['name'];
$config['upload_path']   = './images/User_files/';
$config['allowed_types'] = 'gif|jpg|png';
$config['file_name']     = $user_image;
$config['max_size']      = '100';
$config['max_width']     = '1024';
$config['max_height']    = '768';

$this->load->library('upload', $config);

if ( ! $this->upload->do_upload())
{
$data["error"] = array('error' => $this->upload->display_errors());

echo json_encode($data);
}
else
{
$data = array('upload_data' => $this->upload->data());

echo '{"success": "true"}';
}

А также я попробовал следующий код PHP:

if($_FILES['user_image']['size'] > 0)
{
$user_image = substr(number_format(time() * rand(), 0, '', ''), 0, 8);

if (preg_match('/^image\/p?jpeg$/i', $_FILES['user_image']['type']) or
preg_match('/^image\/gif$/i', $_FILES['user_image']['type']) or
preg_match('/^image\/jpg$/i', $_FILES['user_image']['type']) or
preg_match('/^image\/(x-)?png$/i', $_FILES['user_image']['type']))
{
if (preg_match('/^image\/p?jpeg$/i', $_FILES['user_image']['type']))
{
$ext = '.jpg';
}
else if (preg_match('/^image\/gif$/i', $_FILES['user_image']['type']))
{
$ext = '.gif';
}
else if (preg_match('/^image\/jpg$/i', $_FILES['user_image']['type']))
{
$ext = '.jpg';
}
else if (preg_match('/^image\/(x-)?png$/i', $_FILES['user_image']['type']))
{
$ext = '.png';
}

$user_image = $user_image.$ext;
$user_imagetoStore = './images/User_files/'.$user_image;
copy($_FILES['user_image']['tmp_name'],$user_imagetoStore);
}
else
{
$user_image= "";
}
}

0

Решение

Пара мыслей:

  1. Код Objective-C использует поле с именем userfile и фрагменты PHP используют user_image,

  2. Второй фрагмент кода PHP не генерирует никакого ответа JSON.

  3. Я бы также предложил просто:

    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    

    Это, вероятно, не имеет значения, но я бы также использовал nil скорее, чем Nil когда ты звонишь POST метод.

  4. Если вышеупомянутое не работает, я бы также предложил запустить это на симуляторе и посмотреть это в Чарльзе (http://charlesproxy.com) и посмотреть, если запрос выглядит нормально.

0

Другие решения

Других решений пока нет …