Как загрузить файл на предварительно назначенный URL-адрес AWS с помощью PHP Curl? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь загрузить файл из... »в AWS через предварительно заданный URL-адрес с помощью PHP Curl.

Несмотря на то, что файл успешно загружен, после загрузки недавно загруженного файла попытка открыть только что загруженный файл не удалась. Я получаю либо «этот файл поврежден», либо «похоже, что мы не поддерживаем этот формат файла», либо «мы не можем открыть этот файл» в зависимости от типа файла. Я не получаю ответа от AWS через curl_exec или curl_error при загрузке.

Я в основном скопировал код PHP из POSTMAN, поскольку POSTMAN успешно загружает файл, когда файл присоединен как «двоичный». Так как мой код присоединяет файл через CURLOPT_POSTFIELDS в моем коде, это может быть проблемой? Любой другой пример, который я видел, прикрепляет файл через curl_file_create и CURLOPT_POSTFIELDS, так что я использую это.

Единственные инструкции, которые я имею при загрузке файла:

curl -X PUT \
  "https://PRESIGNED_PUT_URL_FROM_RESPONSE" \
  --upload-file ~/Documents/Files/the_file.pdf

IЯ пытался изменить тип содержимого в заголовке на фактический тип загруженного файла, но ни один из них не работает. Я пробовал и CURLFile и curl_file_create. Файлы после загрузки на мой тестовый сервер и сервер моего веб-сайта все еще действительны до загрузки в AWS.

    $file_name = $post_files[$FILES_file]["name"];
    $content_type = $post_files[$FILES_file]["type"];
    $TheFileSize = $post_files[$FILES_file]["size"];
    $tmp_name = $post_files[$FILES_file]["tmp_name"];
    $curl = curl_init();
    $cFile = curl_file_create($tmp_name, $content_type, $file_name);

    $payload = array('upload-file' => $cFile);

    $curlOptions = array(
            CURLOPT_URL            => $TheAWSPresignedURL,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_CUSTOMREQUEST  => "PUT",
            CURLOPT_ENCODING       => "",
            CURLOPT_POST           => 1,
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_TIMEOUT        => 300,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_INFILESIZE     => $TheFileSize,
            CURLOPT_HTTPHEADER     => array(
                "Accept: */*",
                "Accept-Encoding: gzip, deflate",
                "Cache-Control: no-cache",
                "Connection: keep-alive",
                "Content-Length: ".$TheFileSize,
                "Content-Type: multipart/form-data",
                "Host: s3.amazonaws.com"
            ),
        );
    curl_setopt_array($curl, $curlOptions);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);  
    $response = curl_exec($curl);

Я ищу файл, который будет успешно загружен в AWS по заданному URL-адресу, загруженуспешно и успешно открыт.

[ОБНОВЛЕНИЕ]

Попытка загрузки текстовых файлов вместо изображений и PDF, которые были основными типами файлов, для которых мы разрабатывали. Загрузка этих файлов оказалась «успешной» в том смысле, что я смог открыть их, однако в начало текстового файла был добавлен текст.

Если загружено как Content-Type: multipart / form-данные, файл еще можно было загрузить, но при его открытии этот текст был добавлен в начало файла.

--------------------------9cd644e15677104b Content-Disposition: form-data; name="upload-file"; filename="SimpleTextFile.txt" Content-Type: text/plain

Если загружено как Content-Type: $ content_type,ссылка для скачивания открыла файл в новом окне браузера с этим текстом, добавленным в файл.

--------------------------3dca3db029b41ae2 Content-Disposition: attachment; name="upload-file"; filename="SimpleTextFile2.txt" Content-Type: text/plain

1 Ответ

0 голосов
/ 02 ноября 2019

Замена $payload = array('upload-file' => $cFile); на $payload = file_get_contents( $tmp_name ); решила мою проблему. Похоже, мне не нужен curl_file_create или массив и ключ upload-file вообще.

Кроме того, https://stackoverflow.com/a/21888136 прямой загрузки контента должен удалить информацию заголовка, и это произошло.

Спасибо всем за понимание, как вы указали мне в правильном направлении!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...