如何用C++ cURL构造包含ObjectName的PUT对象请求?
解决cURL PUT请求缺少对象路径的问题
你的问题核心是URL中没有包含要上传的对象路径(/ObjectName),导致cURL生成的请求行没有资源路径,默认操作Bucket而非具体对象。
直接解决方案:修改URL,添加ObjectName
把CURLOPT_URL的地址改成包含对象路径的完整URL,格式为:https://BucketName.oss-cn-hangzhou.aliyuncs.com/ObjectName
修改后的代码片段:
// 替换成你的Bucket域名+对象路径 curl_easy_setopt(curl, CURLOPT_URL, "https://tva******.oss*****.aliyuncs.com/your-target-object-name");
这样cURL会自动从URL中提取/your-target-object-name作为请求行的资源路径,生成符合预期的PUT /your-target-object-name HTTP/1.1请求。
额外注意事项
- 特殊字符转义:如果ObjectName包含空格、中文或其他特殊字符,需要用
curl_easy_escape进行URL编码,避免请求错误:
char* escaped_obj_name = curl_easy_escape(curl, "你的对象名称(含特殊字符)", 0); string full_url = "https://tva******.oss*****.aliyuncs.com/" + string(escaped_obj_name); curl_easy_setopt(curl, CURLOPT_URL, full_url.c_str()); curl_free(escaped_obj_name); // 记得释放内存
- 移除手动设置的Content-Length:你已经通过
CURLOPT_INFILESIZE_LARGE设置了文件大小,cURL会自动生成正确的Content-Length头,手动添加可能导致头信息冲突,建议删除这一行:
// 删掉这行 headerList = curl_slist_append(headerList, ("Content-Length: " + size).c_str());
内容的提问来源于stack exchange,提问作者Maple Q
相关产品推荐
相关产品推荐

