使用Google.Cloud.Storage.V1在.NET中下载超2GB文件的问题
解决Google Cloud Storage下载超过2GB文件的流处理问题
针对你使用Google.Cloud.Storage.V1 2.2.1版本时,MemoryStream无法处理2GB以上文件的问题,提供两种可行方案:
方案一:使用临时文件流(通用所有.NET环境,推荐大文件场景)
通过FileStream创建临时文件存储下载内容,规避内存限制,且能自动清理临时文件:
private async Task<Stream> LoadStream(BlobFileStreamRequest request) { // 创建临时文件,流关闭时自动删除文件 var tempFilePath = Path.GetTempFileName(); var fileStream = new FileStream( tempFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None, bufferSize: 4096, options: FileOptions.Asynchronous | FileOptions.DeleteOnClose ); try { await LocalRetryPolicy.ExecuteAsync(async () => { var bucketName = request.StoreContext.BucketName; var fileName = FileName(request.StoreContext.RelativePath, request.FileName); await StorageClient.DownloadObjectAsync(bucketName, fileName, fileStream); fileStream.Position = 0; }); return fileStream; } catch { // 下载失败时提前清理资源 fileStream.Dispose(); throw; } }
说明
FileOptions.DeleteOnClose确保流关闭时系统自动删除临时文件,避免残留。- 异步文件流配置提升下载效率,适用于大文件场景。
- 调用方使用完流后需正确调用
Dispose(),触发临时文件删除。
方案二:.NET Core/.NET 5+环境下使用大内存流
如果运行环境是.NET Core 2.1+或.NET 5+,可以直接启用MemoryStream的大内存支持:
private async Task<Stream> LoadStream(BlobFileStreamRequest request) { // 允许MemoryStream分配超过2GB的内存 var memStream = new MemoryStream { AllowLargeMemoryStream = true }; await LocalRetryPolicy.ExecuteAsync(async () => { var bucketName = request.StoreContext.BucketName; var fileName = FileName(request.StoreContext.RelativePath, request.FileName); await StorageClient.DownloadObjectAsync(bucketName, fileName, memStream); memStream.Position = 0; }); return memStream; }
说明
- .NET Core及更高版本中,
MemoryStream默认允许大内存分配,显式设置AllowLargeMemoryStream = true是为了确保行为明确。 - 该方案会占用大量系统内存,仅推荐内存充足且文件体积可控的场景。
内容的提问来源于stack exchange,提问作者Amit Tikoo
相关产品推荐
相关产品推荐

