PHP cURL POST请求 - 上传过程中文件损坏
问题描述:
我试图使用以下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--
任何想法为什么发生这种情况?
答
尝试在您的CURLOPT_POSTFIELDS
阵列中添加名称值。
$data = array('name' => 'SomeName', 'file' => '@' . realpath($filePath));
顺便说一句,你no longer needCURLOPT_BINARYTRANSFER
。
答
想通了。修改我的代码为
$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_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-- –