从ASP.NET Core Web API将多GB文件流式传输到AWS S3
我希望从ASP.NET Core Web API在AWS S3存储桶中创建一个大型(多GB)文件.该文件足够大,我希望在将Stream上传到AWS S3之前不将其加载到内存中.
使用PutObjectAsync()我强制在将Stream传递给AWS SDK之前预先填充Stream,如下图所示: var putObjectRequest = new PutObjectRequest { BucketName = "my-s3-bucket",Key = "my-file-name.txt",InputStream = stream }; var putObjectResponse = await amazonS3Client.PutObjectAsync(putObjectRequest); 我理想的模式将涉及AWS SDK返回StreamWriter(各种类型)我可以多次写入(),然后在完成后返回Finalize(). 关于我的挑战的两个问题: >我是否误以为在调用PutObjectAsync()之前必须预先填充Stream? 解决方法
对于这种情况,AWS docs提供了两种选择:
> Using the AWS .NET SDK for Multipart Upload (High-Level API) 高级API只是建议您创建一个指定了PartSize的 显然,Low-level API更复杂,但更灵活 – 您可以启动上传,之后您会在循环中上传文件的下一部分.文档中的示例代码: var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); // List to store upload part responses. var uploadResponses = new List<UploadPartResponse>(); // 1. Initialize. var initiateRequest = new InitiateMultipartUploadRequest { BucketName = existingBucketName,Key = keyName }; var initResponse = s3Client.InitiateMultipartUpload(initRequest); // 2. Upload Parts. var contentLength = new FileInfo(filePath).Length; var partSize = 5242880; // 5 MB try { long filePosition = 0; for (var i = 1; filePosition < contentLength; ++i) { // Create request to upload a part. var uploadRequest = new UploadPartRequest { BucketName = existingBucketName,Key = keyName,UploadId = initResponse.UploadId,PartNumber = i,PartSize = partSize,FilePosition = filePosition,FilePath = filePath }; // Upload part and add response to our list. uploadResponses.Add(s3Client.UploadPart(uploadRequest)); filePosition += partSize; } // Step 3: complete. var completeRequest = new CompleteMultipartUploadRequest { BucketName = existingBucketName,}; // add ETags for uploaded files completeRequest.AddPartETags(uploadResponses); var completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest); } catch (Exception exception) { Console.WriteLine("Exception occurred: {0}",exception.ToString()); var abortMPURequest = new AbortMultipartUploadRequest { BucketName = existingBucketName,UploadId = initResponse.UploadId }; s3Client.AbortMultipartUpload(abortMPURequest); } Asynchronous version of (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 知道当前的URL是否包含在RouteTable.Routes中
- 如何在asp.net MVC3 Razor上编写html字段
- ASP.NET 或C# 中ASCII码含中文字符的编解码处理
- asp.net – 本地化mvc中的默认模型验证2
- asp.net – 如何关闭.NET站点进行维护?
- asp.net-web-api – Azure AD / B2C用户的安全API
- ASP.net缓存访问导致foreach循环中的Collection Modified异
- 在asp.net-mvc中,有没有办法区分处于兼容模式的IE7用户和IE
- asp.net-mvc-3 – 自定义ActionInvoker与MVC 3中ActionFilt
- asp.net-web-api – 无法在Mono / xsp4中加载类型’System.
- 对于单个控件,asp.net – ValidateRequest =“fa
- C# 之 DataReader 和 DataSet 的区别
- asp.net – 替换过时的System.Xml.XmlDataDocume
- 将typescript定义文件编译到wwwroot文件夹时出现
- asp.net – 在VS 2010中发布到Azure时出错 – 对
- 在ASP.NET中使用Web API而不是Web方法有什么优势
- asp.net-mvc – ASP.NET MVC在自定义操作过滤器中
- 如何使用ASP.NET Repeater删除尾随逗号?
- asp.net web表单json返回结果
- 带有标准ASP.NET控件的jQuery datepicker