You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:21:03