通过ASP.net-core2应用程序将文件从客户端直接上传到s3

时间:2018-02-05 23:24:33

标签: c# asp.net amazon-s3 streaming asp.net-core-2.0

背景:用户有一个要上传的文件与其他多种形式的文本数据配对。这是POST的我们的ASP.net核心2应用程序,然后有一些逻辑围绕成功下载该文件。

我知道我可以为客户端生成预先签名的S3 URL,但我们希望避免这种情况。

我遇到的问题是无法直接将文件流式传输到S3。我们可以在本地保存文件,然后将该文件流式传输到S3(成功),但我们希望避免这种情况,因为我们会遇到扩展问题。我们希望尽可能减少数据的缓存以便流式传输到S3,并且不要将任何文件本地保存到光盘以便上传。

我尝试了多种口味的

TransferUtility.UploadAsync(stream, ...)  
IAmazonS3.UploadPartAsync(...)  
IAmazonS3.UploadObjectFromStreamAsync(...)  

https://docs.aws.amazon.com/AmazonS3/latest/dev/LLuploadFileDotNet.html

以及其他一些我不能再记得的方式。

这是我在大多数尝试中遇到的问题https://github.com/aws/aws-sdk-net/issues/675

如何使用提供的HTTP流将上述数据上传到S3?

这就是我在resultscontroller中处理文件流的方式:

[HttpPost("myupload")]
public async Task<IActionResult> TestBlobAsync()
{
    result = await this._internMethod(Request);
}

我正在使用以下POSTMAN HTTP配置文件测试我的软件

POST /api/result/myupload HTTP/1.1
Host: localhost:62788
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: a17bef73-6015-c547-6f41-bc47274cb679

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="result"; filename="dummy-35MB.bin"
Content-Type: application/octet-stream


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="value1"

2
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="value2"

8
------WebKitFormBoundary7MA4YWxkTrZu0gW--

如果我能提供任何其他详细信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

我的解决方法是改变

[HttpPost("myupload")]
public async Task<IActionResult> TestBlobAsync()
{
    result = await this._internMethod(Request);
}

[HttpPost("myupload")]
public async Task<IActionResult> TestBlobAsync(IFileForm file)
{
    ...
}

我现在可以使用Stream stream = file.OpenReadStream()并将其传递给TransferUtility.UploadAsync(stream, ...),并成功解决了我手动利用Request对象时缺少的内容长度问题。