Невозможно загрузить файл (multipart / form-data) на сервер, используя PHP -CURL - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь загрузить файл в бэкэнд-сервис из пользовательского интерфейса, используя PHP прокси-сервис. Я могу видеть содержимое файла в прокси-сервисе, но не могу отправить его в бэкэнд-сервис, используя PHP - CURL.

Сводка наших настроек:

  • UI (AngularJS + HTTP), PHP (служба прокси), работающая на NGINX сервере
  • JAVA (служба бэкенда - предоставление API), работающая на сервере Play в том же machine

Summary Image

Интерфейс пользователя выполняет вызовы Backend API через прокси-сервис PHP. Я использую этот код https://github.com/softius/php-cross-domain-proxy в нашем проекте.

К сожалению, этот не поддерживает загрузку файлов , поэтому я изменил прокси-код для поддержки загрузки файлов используя multipart / form-data и фрагмент кода :

curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);   // (re-)send headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);     // return response
curl_setopt($ch, CURLOPT_HEADER, true);       // enabled response headers

if(array_key_exists('CONTENT_TYPE', $_SERVER) && strpos($_SERVER['CONTENT_TYPE'], 'multipart/form-data;') === 0) {
    debug("Request has Multipart Files: " . print_r($_FILES, true));
    $filesList = $_FILES;
    if(empty($request_params)) {
        $request_params = array();
    }
    foreach ($filesList as $key => $fileProps) {
        $request_params[$key] = new CurlFile($fileProps['tmp_name'], $fileProps['type'], $fileProps['name']);
    }
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
    debug("Request Params with CurlFile(s): " . print_r($request_params, true));
}

// add data for POST, PUT or DELETE requests
if ('POST' == $request_method) {
    $post_data = is_array($request_params) ? http_build_query($request_params) : $request_params;
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,  $post_data);
} elseif ('PUT' == $request_method || 'DELETE' == $request_method) {
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_method);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request_params);
}

// Set multiple options for curl according to configuration
if (is_array($curl_options) && 0 <= count($curl_options)) {
    curl_setopt_array($ch, $curl_options);
}
debug("Initiating CURL $request_method call with data: " . print_r($request_params, true));

// retrieve response (headers and content)
$response = curl_exec($ch);
curl_close($ch);

debug("Response Received from CURL: " . print_r($response, true));

В журналах отладки я вижу эту строку "Инициирование вызова CURL $ request_method с данными: {. ..} ", но опубликуйте, что логи не появляются! И звонок не дошел и до нашего бэкэнда.

Кто-нибудь может указать, если я что-то здесь упускаю?

Я просто хочу понять, почему не работает только вызов File Upload, в то время как вызов другие вызовы API работают отлично.

Полный прокси-код для справки: https://gist.github.com/Elavarasanlee/4cee04c7cdafa869e6e55383fab1813b

РЕДАКТИРОВАТЬ:

Я попытался добавить curl_setopt($curlhandle, CURLOPT_VERBOSE, true); для отладки трассировки CURL. Только для загрузки API вызов не получил никакой трассировки!

...