背景:用户有一个要上传的文件与其他多种形式的文本数据配对。这是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--
如果我能提供任何其他详细信息,请告诉我。
答案 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对象时缺少的内容长度问题。