PHP cURL POST请求 - 上传期间文件已损坏

时间:2015-04-17 08:46:53

标签: 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);

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

  

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

     

内容 - 处置:表单数据; NAME = “文件”;   文件名= “/无功/网络/可湿性粉剂内容/上传/ redmine_uploads / emptyTextFile.txt”   Content-Type:application / octet-stream

     

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

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:4)

想出来。将我的代码修改为

$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);

产生所需的文件上传。

答案 1 :(得分:0)

尝试在CURLOPT_POSTFIELDS数组中添加名称值。

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

另外,您no longer need CURLOPT_BINARYTRANSFER