2015-04-17 63 views
1

我试图使用以下PHP代码将文件上传到Redmine。PHP cURL POST请求 - 上传过程中文件损坏

$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 = “文件”; filename =“/ var/www/wp-content/uploads/redmine_uploads/emptyTextFile.txt” Content-Type:application/octet-stream

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

任何想法为什么发生这种情况?

回答

0

尝试在您的CURLOPT_POSTFIELDS阵列中添加名称值。

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

顺便说一句,你no longer needCURLOPT_BINARYTRANSFER

+0

排除'CURLOPT_BINARYTRANSFER'和编辑 '$ data = array('name'=>'emptyTextFile','file'=>'@'。$ filePath);' 仍导致一个损坏的文件现在包含行 ------------------------------ a943ac000d23 Content-Disposition:form-data; name =“name” emptyTextFile ------------------------------ a943ac000d23 Content-Disposition:form-data; NAME = “文件”; filename =“/ var/www/wp-content/uploads/redmine_uploads/emptyTextFile.txt” Content-Type:application/octet-stream ----------------- ------------- a943ac000d23-- –

3

想通了。修改我的代码为

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

产生所需的文件上载。