Страница не отображалась, потому что объект запроса слишком велик при отправке большого POST-запроса с веб-сервера на серверную часть IIS

#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.