У меня есть следующая команда завитка от
curl -sSLX POST 'https://file-scan.aws.us.pangea.cloud/v1/scan' \
-H 'Authorization: Bearer my-token-goes here' \
-H 'Content-Type: multipart/form-data' \
-F 'request = {"transfer_method":"multipart"};type=application/json' \
-F '[email protected];type=application/octet-stream'
Теперь мне нужно написать завиток на PHP, чтобы можно было загружать файлы согласно коду ниже.
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://file-scan.aws.us.pangea.cloud/v1/scan');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer my-token-goes-here',
'Content-Type: multipart/form-data',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'request' => '{"transfer_method":"multipart"}',
'upload' => new CURLFile('AnnBall.png', 'application/octet-stream'),
]);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
echo $response = curl_exec($ch);
curl_close($ch);
?>
Вот ошибка, которую я получил
{"request_id":"prq_nxj6w7ws5ussjsniphkzk7i3pqlf5peu","request_time":"2024-04-25T17:15:00.638627Z","response_time":"2024-04-25T17:15:01.722276Z","status":"Недействительно Ошибка тела" ,"summary":"Не удалось прочитать тело запроса","result":null}
может кто-нибудь помочь мне решить проблему
Думаю, об этом говорит следующее: RAW POST с использованием cURL в PHP
Вот некоторые возможные проблемы с вашим кодом:
При использовании multipart/form-data
убедитесь, что для параметра CURLOPT_POSTFIELDS
передается строка, а не массив. PHP автоматически закодирует массив в формат multipart/form-data
, если вы передадите массив, но в этом случае он не будет правильно обрабатывать вложенные данные. Поэтому вам необходимо вручную построить составное тело.
Убедитесь, что путь к файлу AnnBall.png
правильный и доступен из вашего PHP-скрипта.
Вот рабочий код, который вы можете попробовать:
<?php
// Endpoint URL
$url = 'https://file-scan.aws.us.pangea.cloud/v1/scan';
// Request headers
$headers = [
'Authorization: Bearer YOUR_ACCESS_TOKEN', // Replace YOUR_ACCESS_TOKEN with your actual token
'Content-Type: multipart/form-data'
];
// Request data
$data = [
'request' => json_encode(["transfer_method" => "multipart"]),
'upload' => new CURLFile('AnnBall.png', 'application/octet-stream', 'upload')
];
// Initialize cURL session
$ch = curl_init();
// Set cURL options
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false, // Note: set to true in production for better security
]);
// Execute the request
$response = curl_exec($ch);
// Check for errors
if ($response === false) {
echo 'cURL error: ' . curl_error($ch);
}
// Close cURL session
curl_close($ch);
// Output response
echo $response;
?>
Вот простое объяснение приведенного выше кода:
Я использую функцию curl_setopt_array
для установки нескольких параметров одновременно, а также использую функцию curl_file_create
для управления загрузкой файлов.
Примечание:
Замените YOUR_ACCESS_TOKEN
своим реальным токеном.
Вы можете использовать incarnate.github.io/curl-to-php для конвертации в PHP. Он довольно старый, в нем до сих пор используется
@filename
вместоnew CURLFile()
, но должно работать.