您无法像打开磁盘上的文件一样打开IFormFile
。您必须改为使用IFormFile.OpenReadStream()
。 Docs here
public async Task<ActionResult> UploadDocument([FromForm]DataWrapper data)
{
IFormFile file = data.File;
long length = file.Length;
if (length < 0)
return BadRequest();
using var fileStream = file.OpenReadStream();
byte[] bytes = new byte[length];
fileStream.Read(bytes,(int)file.Length);
}
fileStream.Read(bytes,(int)file.Length);
似乎为空的原因是,因为它是空的。 IFormFile.Filename
是请求给出的文件名,在磁盘上不存在。
,
您的代码的意图似乎是写入FileStream,而不是字节缓冲区。实际上, 所做的是 create 一个新的空文件,并将其从其中读取到已清除的缓冲区中。从未使用上传的文件。
写入文件
如果您确实要保存文件,则可以使用CopyTo:
using(var stream = File.Create(Path.Combine(folder_I_Really_Want,file.FileName))
{
file.CopyTo(stream);
}
如果要从上传的文件读取缓冲区而不保存到磁盘,请使用MemoryStream。那只是byte[]
缓冲区之上的Stream API缓冲区。您不必指定大小,但是随着内部缓冲区的增加,它可以减少重新分配。
读入byte[]
通过MemoryStream读入byte []本质上是相同的:
var stream = new MemoryStream(file.Length);
file.CopyTo(stream);
var bytes=stream.ToArray();
,
问题是您要根据模型中的文件名打开一个新的文件流,该文件名将是用户上载时选择的文件名。您的代码将使用该名称创建一个新的空文件,这就是为什么您在文件系统中看到该文件的原因。然后,您的代码正在从该文件读取为空的字节。
您需要使用IFormFile.OpenReadStream方法或CopyTo方法之一来从流中获取实际数据。
然后使用所需名称将该数据写入文件系统中的文件中。
var filename ="[Enter or create name for your file here]";
using (FileStream fs = new FileStream(filename,FileMode.OpenOrCreate))
//Create the file in your file system with the name you want.
{
using (MemoryStream ms = new MemoryStream())
{
//Copy the uploaded file data to a memory stream
file.CopyTo(ms);
//Now write the data in the memory stream to the new file
fs.Write(ms.ToArray());
}
}
本文链接:https://www.f2er.com/3052333.html