将表单文件转换为内存流时出错

本文关键字:出错 内存 表单 文件 转换 | 更新日期: 2023-09-27 17:56:41

我正在尝试上传文件并保存到 Azure Blob 存储中。该文件作为窗体文件注入。问题是,当我将FormFile转换为内存流时出现错误。然后,流上传到 Azure,但不包含任何数据。

 public async Task<IActionResult> Create([Bind("EndorsementId,FileName,ProviderId,Title")] Endorsement endorsement, IFormFile formFile)
    {
        if (ModelState.IsValid)
        {
            ...
            var data = new MemoryStream();
            formFile.CopyTo(data);
            var buf = new byte[data.Length];
            data.Read(buf, 0, buf.Length);
            UploadToAzure(data);
            ...

这些错误位于内存流的 ReadTimeOut 和 WriteTimeOut 属性上。他们说"数据"。ReadTimeout"抛出了一个类型为"System.InvalidOperationException"和"data"的异常。WriteTimeout"分别抛出了一个类型为"System.InvalidOperationException"的异常。

这是我如何注入表单文件。这方面的信息似乎很少。http://www.mikesdotnetting.com/article/288/uploading-files-with-asp-net-core-1-0-mvc

提前谢谢。

将表单文件转换为内存流时出错

IFormFile为此CopyToAsync方法。您可以执行以下操作:

using (var outputStream = await blobReference.OpenWriteAsync())
{
    await formFile.CopyToAsync(outputStream, cancellationToken);
}
填写

数据后,MemoryStream的偏移量仍位于文件末尾。 您可以重置位置:

var data = new MemoryStream();
formFile.CopyTo(data);
// At this point, the Offset is at the end of the MemoryStream
// Either do this to seek to the beginning
data.Seek(0, SeekOrigin.Begin);
var buf = new byte[data.Length];
data.Read(buf, 0, buf.Length);
UploadToAzure(data);

或者,您可以MemoryStreamCopyTo()调用后执行以下操作,而不是自己完成所有工作,只需将数据复制到byte[]数组中:

// Or, save yourself some work and just do this 
// to make MemoryStream do the work for you
UploadToAzure(data.ToArray());

还可以将 IFormFile 的内容上传到 Azure Blob 存储,如下所示:

using (var stream = formFile.OpenReadStream())
{
    var blobServiceClient = new BlobServiceClient(azureBlobConnectionString);
    var containerClient = blobServiceClient.GetBlobContainerClient("containerName");
    var blobClient = containerClient.GetBlobClient("filename");
    await blobClient.UploadAsync(stream);
}