将表单文件转换为内存流的错误

时间:2016-07-11 23:58:50

标签: c# asp.net asp.net-mvc asp.net-core-mvc asp.net-core-1.0

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

<service
  android:name="com.example.appName"
  android:process=":externalProcess" />

错误在内存流的ReadTimeOut和WriteTimeOut属性上。他们说&#39; data.ReadTimeout&#39;抛出类型&#39; System.InvalidOperationException&#39;和&#39; data.WriteTimeout&#39;抛出类型&#39; System.InvalidOperationException&#39;分别

以下是我如何注入FormFile。关于这一点的信息似乎很少。 http://www.mikesdotnetting.com/article/288/uploading-files-with-asp-net-core-1-0-mvc

提前致谢。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

填写数据后,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);

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

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

答案 2 :(得分:0)

您还可以像这样将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);
}