我正在尝试让用户将文件上传到Azure。从基于角度的页面上传到.net core可以正常工作。它作为IFormFile传入。但是,当我尝试将IFormFile上传到Azure Blobs容器时,它将引发以下错误:
这是我的代码:
Sheet data = JsonConvert.DeserializeObject<Sheet>(Request.Form["data"]);
IFormFile formFile = Request.Form.Files[0];
data.DateAdded = DateTime.Now.ToString();
if (formFile.FileName.EndsWith(".pdf"))
{
if (formFile.Length > 0)
{
//db.Sheets.Add(data);
//db.SaveChanges();
string path = data.StoreLocation.ProjectName;
CloudBlockBlob blockBlob = container.GetBlockBlobReference(path);
await blockBlob.UploadFromStreamAsync(formFile.OpenReadStream());
}
}
我认为IFormFile上传流在用户完全上传之前已关闭。根据多个文档,此代码应该可以正常工作...我确实通过首先将文件保存到文件系统来使其正常工作。但这增加了不必要的动作...
答案 0 :(得分:0)
这里的代码似乎没有任何明显的错误。 ObjectDisposedException
表示支持流的对象已被处置,在返回响应之前不应该发生这种情况,只要您正在等待异步任务,就不应发生这种情况。>
鉴于这里没有很多需要工作的东西,这大部分只是猜测。我认为正在发生的事情是客户端正在取消该请求,这将导致引发TaskCancelledException
。但是,由于您没有将取消令牌传递到异步任务中,因此无法监视取消任务。因此,它可能会令人窒息。如果该方法允许您传递取消令牌,则应该:
public async Task<IActionResult> Foo(..., CancellationToken cancellationToken = default)
{
...
await blockBlob.UploadFromStreamAsync(formFile.OpenReadStream(), cancellationToken);
}