PHP cURL POST 请求 - 文件在上传过程中损坏

And*_*idt 1 php curl redmine

我正在尝试使用以下 PHP 代码将文件上传到 Redmine。

$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);
Run Code Online (Sandbox Code Playgroud)

此请求返回有效的上传令牌,但文件在上传过程中已损坏。例如,尝试上传空的 .txt 文件会导致上传的被覆盖的 .txt 文件现在包含以下行。

------------------------------------------dde946a683ac

内容处置:表单数据;名称=“文件”;filename =“/var/www/wp-content/uploads/redmine_uploads/emptyTextFile.txt”内容类型:application/octet-stream

------------------------------------------dde946a683ac--

有什么想法为什么会发生这种情况吗?

And*_*idt 5

弄清楚了。将我的代码修改为

$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);
Run Code Online (Sandbox Code Playgroud)

产生所需的文件上传。