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

C# 将表单文件转换为内存流时出错,c#,asp.net,asp.net-mvc,asp.net-core-mvc,asp.net-core-1.0,C#,Asp.net,Asp.net Mvc,Asp.net Core Mvc,Asp.net Core 1.0,我正在尝试上载一个文件并保存到Azure Blob存储中。 该文件作为FormFile注入。 问题是,将FormFile转换为内存流时会出现错误。然后该流上载到Azure,但不包含任何数据 public async Task<IActionResult> Create([Bind("EndorsementId,FileName,ProviderId,Title")] Endorsement endorsement, IFormFile formFile) {

我正在尝试上载一个文件并保存到Azure Blob存储中。 该文件作为FormFile注入。 问题是,将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);

            ...
public async Task Create([Bind(“背书,文件名,ProviderId,Title”)]背书背书,IFormFile formFile)
{
if(ModelState.IsValid)
{
...
var数据=新内存流();
formFile.CopyTo(数据);
var buf=新字节[data.Length];
读取数据(单位,0,单位长度);
上传至(数据);
...
错误出现在内存流的ReadTimeOut和WriteTimeOut属性上。它们表示“data.ReadTimeOut”引发了“System.InvalidOperationException”类型的异常,而“data.WriteTimeOut”则分别引发了“System.InvalidOperationException”类型的异常

下面是我如何注入表单文件的。关于这方面的信息似乎很少。


提前感谢。

在您填写数据后,
内存流的偏移量仍在文件末尾。您可以重置位置:

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);
或者,您可以在调用
CopyTo()
后执行此操作,而不是自己完成所有工作,只需将数据复制到
字节[]
数组中即可:

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

ifformfile
具有用于此目的的
CopyToAsync
方法。您可以执行以下操作:

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

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

使用(var stream=formFile.OpenReadStream())
{
var blobServiceClient=新的blobServiceClient(azureBlobConnectionString);
var containerClient=blobServiceClient.GetBlobContainerClient(“containerName”);
var blobClient=containerClient.GetBlobClient(“文件名”);
等待blobClient.UploadAsync(流);
}

旁注:忽略流上读/写操作的结果通常是个坏主意。