Aws-sdk-net: 未知大小的流式上传

创建于 2018-09-19  ·  4评论  ·  资料来源: aws/aws-sdk-net

预期行为

我们需要直接从 HttpRequest 上传大文件到 blob 存储,而不是存储到文件系统中。
(简单的场景是 https://blogs.visoftinc.com/2013/03/26/streaming-large-files-asynchronously-using-net-4-5/ 或 https://www.strathweb.com/2012/09 /dealing-with-large-files-in-asp-net-web-api/)

当前行为

高级 api ( https://docs.aws.amazon.com/AmazonS3/latest/dev/HLuploadFileDotNet.html ) 需要可搜索的流和流长度,所以这是没有问题的。

低级 api 更有用,但 5 MB 的最小部分大小意味着我们需要为每个并发上传保留 5 MB,这可能会出现问题或昂贵。

可能的解决方案

Azure Blob api 允许我们只传递一个流进行复制,我们只需使用包装流确保每个块不超过 100 MB,而最小大小不是问题,只有大小 0(空文件)我们需要自己处理:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.blob.cloudblockblob.putblockasync?view=azure-dotnet#Microsoft_WindowsAzure_Storage_Blob_CloudBlockBlob_PutBlockAsync_System_String_System_IO_Stream_System_String_System_Threading_CancellationToken_

你的环境

  • 目标 .NET 平台:>= .Net 4.5

不确定这是功能请求还是我们错过了文档中的某些内容。
我们希望支持多个存储后端。

相关: https ://stackoverflow.com/questions/8653146/can-i-stream-a-file-upload-to-s3-without-a-content-length-header

feature-request moduls3

最有用的评论

啊,我明白了。 您想直接写入 HTTP 请求缓冲区。 我认为当前的请求/响应管道不支持这一点。 我现在将其标记为功能请求。

所有4条评论

我不明白这是什么要求。 这是功能要求吗?

保留 5MB 是什么意思? 即使高级库支持上传未知大小的文件,它也会在内存中为每个部分保存 5MB 数据,直到上传完成。 唯一改变的是哪个组件需要内存来完成传输。 从应用程序/进程的角度来看,它仍然需要一个地方来存储不再需要的 5MB 数据。

如果应用程序可以打开“s3 请求流”(将正文作为输出流发布)然后只是 copyAsync 到它( https://docs.microsoft.com/en-us/dotnet/api/system.io.stream .copytoasync?view=netframework-4.7.2 )

上传文件的示例 RestSharp 代码,在某处应该有一个异步版本: https ://stackoverflow.com/questions/32876606/restsharp-addfile-using-stream

webapi 中的示例流响应https://blog.stephencleary.com/2016/10/async-pushstreamcontent.html

重点是缓冲区可以比整个文件部分小得多,并且异步方法在等待更多数据时不应阻塞 Web 服务器线程。

啊,我明白了。 您想直接写入 HTTP 请求缓冲区。 我认为当前的请求/响应管道不支持这一点。 我现在将其标记为功能请求。

关闭,因为我们已经有将数据流式传输到 S3 的功能请求,而没有像https://github.com/aws/aws-sdk-net/issues/1095 这样的内容长度。

现在 S3 需要 content-length 来放置对象或部件。

此页面是否有帮助?
0 / 5 - 0 等级