Объект класса CURLFile не может быть преобразован в строку - PullRequest
4 голосов
/ 04 ноября 2019

Как добиться загрузки изображения через cURL? Я использую Zamzar Sandbox API для преобразования PDF-файла в TXT-файл. Если я использую "https://s3.amazonaws.com/zamzar-samples/sample.pdf" путь PDF для $sourceFile variable, то он работает нормально. Но если я использую системный путь" test.pdf ", то он не работает. Я пытался через curl_file_create, но выдает следующую ошибку:

Исправимая фатальная ошибка: объект класса CURLFile не может быть преобразован в строку в строке.

Я использую PHP версии 7.3.0

<?php
error_reporting(E_ALL);
$endpoint = "https://api.zamzar.com/v1/jobs";
$apiKey = "GiVUYsF4A8ssq93FR48H";
$sourceFile = "https://s3.amazonaws.com/zamzar-samples/sample.pdf";//new CurlFile("test.pdf");
$targetFormat = "txt";


$postData = array(
  "source_file" => $sourceFile,
  "target_format" => $targetFormat
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ":");
$body = curl_exec($ch);
curl_close($ch);
$response = json_decode($body, true);
echo "Response:\n---------\n";
echo"<pre>";
print_r($response);
?>

Response: ---------
Array
(
    [id] => 8442473
    [key] => GiVUYsF4A8ssq93FR48H
    [status] => initialising
    [sandbox] => 
    [created_at] => 2019-11-12T10:35:01Z
    [finished_at] => 
    [import] => Array
        (
            [id] => 671784
            [url] => https://s3.amazonaws.com/zamzar-samples/sample.pdf
            [status] => initialising
        )

    [target_files] => Array
        (
        )

    [target_format] => txt
    [credit_cost] => 0
)

Приведенный выше пример также дает мне вывод. Если я заменю amazonaws с system path, то он не даст никакого ответа.

1 Ответ

2 голосов
/ 04 ноября 2019

CURLOPT_SAFE_UPLOAD всегда установлен на false, и curl ожидает, что файлы будут переданы в виде строки (@/path/to/file) из-за этого. В вашем случае код отправляет файлы как объекты, потому что он использует curl_file_create(), когда доступно.

Когда CURLOPT_SAFE_UPLOAD установлен на false, вы не должны использовать curl_file_create() (это флаг обратной совместимости).

Также попробуйте установить CURLOPT_POSTFIELDS после CURLOPT_SAFE_UPLOAD ( см. Здесь, почему ).

PHP 5.x больше не поддерживается , и я предлагаю избавиться от старого синтаксиса (@/path/to/file и CURLOPT_SAFE_UPLOAD = false) и всегда использовать curl_file_create().

...