#php #android #codeigniter #curl #iis-8
#php #Android #codeigniter #curl #iis-8
Вопрос:
Моя история такова, что у нас есть три клиента (android / ios / web), которые используют серверную часть Restful Microsoft с API suite.
Существует API для загрузки изображений, который приложения для Android / ios успешно загружают большие изображения, но с нашего веб-сервера (PHP / CodeIgniter) не могут не загружать большие изображения со своего сервера. Когда мы отправляем маленькое изображение размером менее 30 КБ, POST-запрос выполняется успешно, но при увеличении изображения POST-запрос всегда возвращает «Страница не отображалась, потому что объект запроса слишком большой». и код ошибки 413.
Ниже приведена моя функция загрузки:
/**
* This function will post an image to Social Plus
* 1. Copy image, which is sent from user's browser, to "upload_path" directory
* 2. Read content of "image file" and insert into body of POST's request
* 3. Send a POST request of binary to SS via Curl library
* 4. Return blobHandle and file's info back to browser
*/
function img_upload(){
$data = array();
$config['upload_path'] = './assets/upload_files/'; //location of image file
$config['allowed_types'] = 'jpeg|png|gif|jpg';
$config['encrypt_name'] = true; //convert normal name file to encrypted file name
$config['max_size'] = 104857600; //1000MB
$session_token = $this->input->post("session_token");
$authorization = "Bearer " . $session_token;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('file'))
{
$error = array('error' => $this->upload->display_errors());
echo json_encode($error);
}
else
{
$data = $this->upload->data();
//Reading content binary of image
$raw_data = file_get_contents($data['full_path']);
$headers = array('Authorization: '.$authorization,'Content-Type: '.$data['file_type'],
'Content-Length: ' . strlen($raw_data));
$image_data = array(
'image' => base64_encode($raw_data)
);
$curl = curl_init ();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,0);
curl_setopt ($curl, CURLOPT_URL, BASE_SOCIAL_PLUS_USER_PHOTO_URL);
curl_setopt($curl, CURLOPT_HTTPHEADER,$headers);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_POST, 1);
curl_setopt( $curl , CURLOPT_VERBOSE , 0 );
curl_setopt ($curl, CURLOPT_POSTFIELDS,$raw_data);
$photo_details = curl_exec($curl);
$photo=json_decode($photo_details,true);
$datestring = '%Y-%m-%d %h:%i:%s:%u %a';
$time = time();
if(curl_errno($curl))
{
echo 'error:xxx' . curl_error($curl);
}
curl_close ( $curl );
if(!isset($photo['blobHandle']))
{
$error = array('error' =>"Oop...Failed to upload image!");
unlink($data['full_path']);
$error["time_stamp"] = mdate($datestring, $time);
$error["api_return"] = $photo_details;
echo json_encode($error);
} else {
$photo_handle=$photo['blobHandle'];
$data['blob_Handle'] = $photo_handle;
$data["time_stamp"] = mdate($datestring, $time);
$data["api_return"] = $photo;
unlink($data['full_path']); //Delete uploaded file
echo json_encode(
array("file_name"=>$data['orig_name'],
"file_size"=>round($data['file_size']),
"blob_handle"=>$photo_handle,
"file_type" => $data["file_type"],
"time_stamp" => $data['time_stamp'],
"api_return" => $data['api_return']));
}
}
}
Ребята из Microsoft не думают, что это их внутренняя ошибка.
Я использовал WireShark для захвата всего пакета с Android и моего локального веб-сервера. Но есть похожие пакеты, которые отправляются. На данный момент мы знаем, что существует ограничение на запрос POST body от IIS 8.5, благодаря которому приложение IOS / Android может отправлять POST big image request на основе HTTP-библиотеки на каждой платформе.
Я также пытаюсь использовать команду CURL для отправки POST-запроса с помощью option -T (файл данных), но это не помогает.
Из результата WireShark с моего веб-сервера на серверную часть ISS отправляется зашифрованный пакет оповещений, и после этого соединение немедленно прерывается. введите описание изображения здесь
Мы пытались исправить это использование в течение недели, но это не помогло.:((
Комментарии:
1. Я просто хочу добавить быстрые обновления. Основная причина — проблема с серверной частью IIS. Если у вас возникает такая проблема, то за проблему должны отвечать сотрудники серверной части IIS.