使用cURL传输PNG图片至Rackspace Cloud Files时文件损坏
问题原因与解决方案
你的问题出在错误使用表单上传方式处理PUT请求:当给CURLOPT_POSTFIELDS传递数组时,curl会自动将请求格式转为multipart/form-data,自动添加边界分隔符、字段描述头等内容,这些额外文本被写入PNG文件,导致文件损坏。Rackspace Cloud Files的PUT接口需要直接上传文件的原始二进制内容,不需要表单封装。
修复后的代码(小文件适用)
直接读取文件原始内容作为请求体,替换原代码中表单相关逻辑:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://storage101.dfw1.clouddrive.com/v1/MossoCloudFS/myContainer/myFile.png'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // 读取文件原始内容,直接作为请求体发送 $fileContent = file_get_contents("myFolder/myFile.png"); curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent); $headers = array(); $headers[] = 'Content-Type: image/png'; $headers[] = 'X-Auth-Token: '.$myID; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } curl_close($ch);
修复后的代码(大文件适用)
如果文件较大,建议用流式上传避免内存占用过高:
$ch = curl_init(); $filePath = "myFolder/myFile.png"; $file = fopen($filePath, "rb"); curl_setopt($ch, CURLOPT_URL, 'https://storage101.dfw1.clouddrive.com/v1/MossoCloudFS/myContainer/myFile.png'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); // 启用上传模式,设置文件句柄和大小 curl_setopt($ch, CURLOPT_UPLOAD, true); curl_setopt($ch, CURLOPT_INFILE, $file); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath)); $headers = array(); $headers[] = 'Content-Type: image/png'; $headers[] = 'X-Auth-Token: '.$myID; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } fclose($file); curl_close($ch);
关键说明
- 移除
curl_file_create和表单数组逻辑,避免curl自动添加multipart格式的额外内容 - 确保请求体是PNG文件的原始二进制数据,上传后的文件将与原文件完全一致
内容的提问来源于stack exchange,提问作者Brent Curry
相关产品推荐
相关产品推荐

