C# 将表单文件转换为内存流时出错
我正在尝试上载一个文件并保存到Azure Blob存储中。 该文件作为FormFile注入。 问题是,将FormFile转换为内存流时会出现错误。然后该流上载到Azure,但不包含任何数据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) {
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(流);
}
旁注:忽略流上读/写操作的结果通常是个坏主意。