C++实现多线程上传大文件至Azure并进行完整性校验
多线程上传Azure Blob并实现完整性校验的方案
直接支持的函数方案
明确说:UploadBlockBlobFromOptions可以同时实现多线程上传和完整性校验,你之前的认知有遗漏。
- 多线程上传:通过
UploadBlockBlobFromOptions内的TransferOptions.Concurrency设置并行线程数,SDK底层会自动拆分文件块完成并行上传,这部分你的理解是对的。 - 完整性校验:
UploadBlockBlobFromOptions继承自UploadBlockBlobOptions,因此同样包含TransactionalContentHash字段。你只需预先计算文件的哈希值,赋值给该字段,Azure存储服务就会在接收完文件后对比发送与接收的哈希值,不匹配则返回错误。
实现步骤示例
计算文件的ContentHash
读取本地文件并计算SHA-256哈希值,封装为Azure::Storage::Blobs::ContentHash对象:#include <azure/storage/blobs.hpp> #include <fstream> #include <cryptopp/sha.h> Azure::Storage::Blobs::ContentHash CalculateFileHash(const std::string& filePath) { CryptoPP::SHA256 sha256; std::ifstream file(filePath, std::ios::binary); std::vector<unsigned char> buffer(4096); size_t bytesRead; while ((bytesRead = file.read(reinterpret_cast<char*>(buffer.data()), buffer.size()).gcount()) > 0) { sha256.Update(buffer.data(), bytesRead); } std::vector<unsigned char> hash(sha256.DigestSize()); sha256.Final(hash.data()); Azure::Storage::Blobs::ContentHash contentHash; contentHash.Sha256 = Azure::Core::Convert::Base64Encode(hash); return contentHash; }配置上传选项并执行多线程上传
设置并发数和哈希值,调用UploadBlockBlobFromFile完成上传:auto blobClient = Azure::Storage::Blobs::BlockBlobClient::CreateFromConnectionString( "你的存储连接字符串", "容器名称", "Blob名称"); Azure::Storage::Blobs::UploadBlockBlobFromOptions options; // 设置多线程并发数 options.TransferOptions.Concurrency = 4; // 设置完整性校验哈希 options.TransactionalContentHash = CalculateFileHash("本地文件路径"); auto response = blobClient.UploadBlockBlobFromFile("本地文件路径", options);
可选的本地二次校验
如果需要额外的本地验证,可在上传完成后调用GetBlobProperties获取Azure存储的Blob哈希值,与本地计算结果对比:
auto properties = blobClient.GetBlobProperties(); if (properties.Value.ContentHash.Sha256 == options.TransactionalContentHash.Value().Sha256) { // 校验通过 } else { // 校验失败,执行错误处理逻辑 }
内容的提问来源于stack exchange,提问作者Jakomo
相关产品推荐
相关产品推荐

