Я пытаюсь загрузить файлы в 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—
Есть идеи, почему это происходит?
Догадаться. Изменение моего кода на
$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);
дает желаемый файл загрузки.
Попробуйте добавить значение имени в вашем CURLOPT_POSTFIELDS
массив.
$data = array('name' => 'SomeName', 'file' => '@' . realpath($filePath));
Как в стороне, вы больше не нужно CURLOPT_BINARYTRANSFER
,