我的问题已关闭,所以我必须更新。
1- 我的目的是将我的压缩文件发送到谷歌云存储 URL。
2- 为此,我生成了一个邮递员请求。我已经使用 postman 工具将我的文件存储到我的 google 云存储中,并且该工具生成了以下代码。
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_URL, "my URL");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type:
application/octet-stream");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,"<file contents here>");
res = curl_easy_perform(curl);
}
curl_easy_cleanup(curl);
3- 然后我将上面的代码复制到我的 C++ 项目中,以将我的压缩文件发送到 URL。
4- 为了创建 CURLOPT_POSTFIELDS
内容,我确实实现了以下代码;
std::ifstream ifs;
ifs.open ("./compressed.gz", std::ios::binary |
std::ios::ate);
PRINT("Size ->", ifs.tellg());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, &ifs);
当我编译并运行我的代码时,请求会返回 200
成功响应。
但是当我检查谷歌存储仪表板时,它只包含 6 个字节的数据。实际上,我的 ifstream
数据的大小是 1090
。
所以我的问题是为什么我的请求将压缩文件的所有字节上传到云存储?我的代码有什么问题?
答案 0 :(得分:2)
c++如何读取压缩文件
压缩文件通常是二进制格式,它们不是空终止文本。您不能使用 strlen
来获取它们的长度,因为这需要一个以空字符结尾的文本作为输入。
您可以使用任何 UnformattedInputFunction 来读取二进制数据。不要忘记以二进制模式打开任何流。
<块引用>我需要将压缩文件放入一个字符指针中,以便使用 libcurl 将其放入服务器。
您无需读取文件即可执行此操作。您可以通过将 FILE*
传递给 CURLOPT_READDATA 来让 libcurl 负责读取文件。
这样就不需要将整个文件存储在内存中。如果文件非常大,读取整个文件可能会出现问题。
答案 1 :(得分:1)
当你想读取二进制数据时,你可以这样做:
std::ifstream file("./compressed.gz", std::ios::binary);
if (!file.is_open())
ERROR();
std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(file), {});
然后你将把它放在向量 buffer
中。通过 buffer.size()
访问大小并使用 buffer.data()
获取原始数据请注意,由于缓冲区是 std::vector
,如果超出范围,它将被破坏,因此数据将被删除。>