Как правильно загружать файлы через Curl в php

У меня есть следующая команда завитка от

источник ссылки

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}

может кто-нибудь помочь мне решить проблему

Вы можете использовать incarnate.github.io/curl-to-php для конвертации в PHP. Он довольно старый, в нем до сих пор используется @filename вместо new CURLFile(), но должно работать.

Barmar 25.04.2024 19:26

Думаю, об этом говорит следующее: RAW POST с использованием cURL в PHP

Luuk 25.04.2024 19:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот некоторые возможные проблемы с вашим кодом:

  1. При использовании multipart/form-data убедитесь, что для параметра CURLOPT_POSTFIELDS передается строка, а не массив. PHP автоматически закодирует массив в формат multipart/form-data, если вы передадите массив, но в этом случае он не будет правильно обрабатывать вложенные данные. Поэтому вам необходимо вручную построить составное тело.

  2. Убедитесь, что путь к файлу 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 своим реальным токеном.

Другие вопросы по теме