B
Beacon Globe News

azure-storage-blobs: Azure::Storage::Blobs::BlockBlobClient Class Reference

Author

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  }