如何使用.Net客户端库向GCP Cloud Storage上传大文件
Google Cloud Storage .Net客户端大文件上传方案
1. 官方推荐:可恢复上传(Resumable Uploads)
Google.Cloud.Storage.V1库内置了可恢复上传支持,专门针对大文件上传场景设计,能在网络中断后恢复上传进度,无需重新传输整个文件,这是官方替代多段上传的标准方案。
代码示例
通过UploadObjectOptions启用可恢复上传:
using Google.Cloud.Storage.V1; using System.IO; var storageClient = StorageClient.Create(); var bucketName = "你的存储桶名称"; var objectName = "大文件名称.zip"; var filePath = @"本地文件路径\large-file.zip"; var options = new UploadObjectOptions { ResumableUpload = true, // 启用可恢复上传 ChunkSize = 64 * 1024 * 1024 // 可选:自定义分段大小,默认8MB,建议设为64MB-128MB提升效率 }; using var fileStream = File.OpenRead(filePath); await storageClient.UploadObjectAsync(bucketName, objectName, null, fileStream, options);
2. 手动实现并行组合上传(按需选择)
如果需要更细粒度的并行控制,也可以基于.Net客户端手动实现并行组合上传逻辑:
- 将本地大文件拆分为固定大小的分段
- 并行上传所有分段到存储桶的临时路径
- 调用
ComposeObjectAsync合并所有分段为最终对象 - 清理临时分段文件
核心代码示例
using Google.Cloud.Storage.V1; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; var storageClient = StorageClient.Create(); var bucketName = "你的存储桶名称"; var objectName = "最终文件名称.zip"; var filePath = @"本地文件路径\large-file.zip"; var segmentSize = 100 * 1024 * 1024; // 每个分段100MB // 1. 拆分文件并并行上传分段 var segmentNames = new List<string>(); using var fileStream = File.OpenRead(filePath); var segmentIndex = 0; var uploadTasks = new List<Task>(); while (fileStream.Position < fileStream.Length) { var segmentName = $"tmp/segment-{segmentIndex:D3}"; segmentNames.Add(segmentName); var segmentStream = new MemoryStream(); await fileStream.CopyToAsync(segmentStream, segmentSize); segmentStream.Position = 0; // 加入并行任务队列 uploadTasks.Add(storageClient.UploadObjectAsync(bucketName, segmentName, null, segmentStream)); segmentIndex++; } await Task.WhenAll(uploadTasks); // 2. 合并所有分段 var composeSources = segmentNames.Select(name => new ComposeObjectSource { Bucket = bucketName, Object = name }).ToList(); await storageClient.ComposeObjectAsync(composeSources, bucketName, objectName); // 3. 删除临时分段 var deleteTasks = segmentNames.Select(name => storageClient.DeleteObjectAsync(bucketName, name)); await Task.WhenAll(deleteTasks);
注意事项
- 可恢复上传是官方最优方案,自动处理重试、中断恢复,无需手动管理分段逻辑
- 手动并行组合上传需要自行处理错误重试、并发控制和临时文件清理,适合有特殊定制需求的场景
- 确保上传账号拥有存储桶的
storage.objects.create和storage.objects.delete权限
内容的提问来源于stack exchange,提问作者Yasitha
相关产品推荐
相关产品推荐

