Я пытаюсь загрузить файл из... »в 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