Запрос PHP cURL POST — файл поврежден во время загрузки

Я пытаюсь загрузить файлы в Redmine, используя следующий код PHP.

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url)
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/octet-stream',
'X-Redmine-API-Key: ' . $apiKey));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, TRUE);

$data = array('file' => '@' . $filePath);

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_POST, 1);

$token = curl_exec($curl);

Этот запрос возвращает действительный токен загрузки, но файл поврежден во время загрузки. Попытка загрузить, например, пустой файл .txt приводит к загрузке перезаписанного файла .txt, который теперь содержит следующие строки.

——————————dde946a683ac

Content-Disposition: форма-данные; Name = «файл»;
filename = «/ var / www / wp-content / uploads / redmine_uploads / emptyTextFile.txt» Тип содержимого: application / octet-stream

——————————dde946a683ac—

Есть идеи, почему это происходит?

1

Решение

Догадаться. Изменение моего кода на

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url)
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/octet-stream',
'X-Redmine-API-Key: ' . $apiKey));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$file = fopen($filePath, 'r');
$size = filesize($filePath);
$filedata = fread($file,$size);

curl_setopt($curl, CURLOPT_POSTFIELDS, $filedata);
curl_setopt($curl, CURLOPT_INFILE, $file);
curl_setopt($curl, CURLOPT_INFILESIZE, $size);

curl_setopt($curl, CURLOPT_POST, 1);

$token = curl_exec($curl);

дает желаемый файл загрузки.

4

Другие решения

Попробуйте добавить значение имени в вашем CURLOPT_POSTFIELDS массив.

$data = array('name' => 'SomeName', 'file' => '@' . realpath($filePath));

Как в стороне, вы больше не нужно CURLOPT_BINARYTRANSFER,

0

По вопросам рекламы [email protected]