azure-storage-blobs: Azure::Storage::Blobs::BlockBlobClient Class Reference
Andrew Campbell
Published Feb 16, 2026
Creates a new block blob, or updates the content of an existing block blob. Updating an existing block blob overwrites any existing metadata on the blob.
186 {
187 constexpr int64_t c_defaultBlockSize = 8 * 1024 * 1024;
188 constexpr int64_t c_maximumNumberBlocks = 50000;
189 constexpr int64_t c_grainSize = 4 * 1024;
190
191 Details::FileReader fileReader(file);
192
193 int64_t chunkSize = c_defaultBlockSize;
194 if (options.ChunkSize.HasValue())
195 {
196 chunkSize = options.ChunkSize.GetValue();
197 }
198 else
199 {
200 int64_t minBlockSize
201 = (fileReader.GetFileSize() + c_maximumNumberBlocks - 1) / c_maximumNumberBlocks;
202 chunkSize = std::max(chunkSize, minBlockSize);
203 chunkSize = (chunkSize + c_grainSize - 1) / c_grainSize * c_grainSize;
204 }
205
206 if (fileReader.GetFileSize() <= chunkSize)
207 {
208 Azure::Core::Http::FileBodyStream contentStream(
209 fileReader.GetHandle(), 0, fileReader.GetFileSize());
210 UploadBlockBlobOptions uploadBlockBlobOptions;
211 uploadBlockBlobOptions.Context = options.Context;
212 uploadBlockBlobOptions.HttpHeaders = options.HttpHeaders;
213 uploadBlockBlobOptions.Metadata = options.Metadata;
214 uploadBlockBlobOptions.Tier = options.Tier;
215 return Upload(&contentStream, uploadBlockBlobOptions);216 }
217
218 std::vector<std::pair<BlockType, std::string>> blockIds;
219 auto getBlockId = [](int64_t id) {
220 constexpr std::size_t c_blockIdLength = 64;
221 std::string blockId = std::to_string(id);
222 blockId = std::string(c_blockIdLength - blockId.length(), '0') + blockId;
223 return Base64Encode(blockId);
224 };
225
226 auto uploadBlockFunc = [&](int64_t offset, int64_t length, int64_t chunkId, int64_t numChunks) {
227 Azure::Core::Http::FileBodyStream contentStream(fileReader.GetHandle(), offset, length);
228 StageBlockOptions chunkOptions;
229 chunkOptions.Context = options.Context;
230 auto blockInfo = StageBlock(getBlockId(chunkId), &contentStream, chunkOptions);231 if (chunkId == numChunks - 1)
232 {
233 blockIds.resize(static_cast<std::size_t>(numChunks));
234 }
235 };
236
237 Details::ConcurrentTransfer(
238 0, fileReader.GetFileSize(), chunkSize, options.Concurrency, uploadBlockFunc);
239
240 for (std::size_t i = 0; i < blockIds.size(); ++i)
241 {
242 blockIds[i].first = BlockType::Uncommitted;
243 blockIds[i].second = getBlockId(static_cast<int64_t>(i));
244 }
245 CommitBlockListOptions commitBlockListOptions;
246 commitBlockListOptions.Context = options.Context;
247 commitBlockListOptions.HttpHeaders = options.HttpHeaders;
248 commitBlockListOptions.Metadata = options.Metadata;
249 commitBlockListOptions.Tier = options.Tier;
250 auto commitBlockListResponse = CommitBlockList(blockIds, commitBlockListOptions);251
252 UploadBlockBlobFromResult result;
253 result.ETag = commitBlockListResponse->ETag;
254 result.LastModified = commitBlockListResponse->LastModified;
255 result.VersionId = commitBlockListResponse->VersionId;
256 result.ServerEncrypted = commitBlockListResponse->ServerEncrypted;
257 result.EncryptionKeySha256 = commitBlockListResponse->EncryptionKeySha256;
258 result.EncryptionScope = commitBlockListResponse->EncryptionScope;
259 return Azure::Core::Response<UploadBlockBlobFromResult>(
260 std::move(result),
261 std::make_unique<Azure::Core::Http::RawResponse>(
262 std::move(commitBlockListResponse.GetRawResponse())));
263 }