使用C++/Poco库上传文件至Google Drive指定文件夹失败
解决Google Drive可恢复上传时文件仅传至根目录的问题
你的核心问题在于Google Drive可恢复上传(resumable upload)的元数据传递方式错误:对于uploadType=resumable的请求,文件的元数据(包括parents)必须通过JSON格式的请求体发送,而不是放在URL查询参数或HTTP请求头里——你当前的两种尝试(URL参数、请求头)都不符合API要求,所以parents参数根本没被正确识别。
修正后的代码示例
#include <Poco/JSON/Object.h> #include <Poco/JSON/Stringifier.h> // 构建元数据JSON对象 Poco::JSON::Object::Ptr metaObj = new Poco::JSON::Object(); metaObj->set("name", targetFilePath.filename().string()); metaObj->set("description", "file from sdk"); // 若metaData本身是JSON字符串,需先解析为JSON对象再放入,否则直接赋值字符串 metaObj->set("properties", metaData); // 添加目标文件夹ID到parents数组 Poco::JSON::Array::Ptr parentsArr = new Poco::JSON::Array(); parentsArr->add(locationId); metaObj->set("parents", parentsArr); // 将JSON对象序列化为字符串 std::string jsonStr; Poco::JSON::Stringifier::stringify(metaObj, jsonStr); // 构造请求URI,仅保留必要参数 Poco::URI uri("https://www.googleapis.com/upload/drive/v3/files"); uri.addQueryParameter("uploadType", "resumable"); uri.addQueryParameter("supportsAllDrives", "true"); // 创建HTTP请求 Poco::Net::HTTPRequest* req = new Poco::Net::HTTPRequest( Poco::Net::HTTPRequest::HTTP_POST, uri.toString(), Poco::Net::HTTPMessage::HTTP_1_1 ); req->add("Authorization", std::string("Bearer ") + accessToken); req->add("Content-Type", "application/json; charset=UTF-8"); req->add("X-Upload-Content-Type", "application/octet-stream"); req->add("X-Upload-Content-Length", std::to_string(iFileSize)); // 设置请求体长度 req->setContentLength(jsonStr.size()); // 发送请求时将jsonStr作为请求体写入输出流 // 示例(基于HTTPSClientSession): // Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort()); // std::ostream& os = session.sendRequest(*req); // os << jsonStr;
关键注意事项
- 确认
locationId是目标文件夹的正确ID,且授权令牌(accessToken)拥有该文件夹的写入权限。 - 若
metaData为JSON格式字符串,不要直接赋值给properties,需先解析为Poco JSON对象再放入,避免格式错误。 - 彻底移除之前在URL参数和请求头中添加的
name、description、properties、parents等元数据参数,避免冲突。
内容的提问来源于stack exchange,提问作者Vishwamithra
相关产品推荐
相关产品推荐

