You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:40:32