我试图读取从HTTP请求中接收到的IFormFile
,如下所示:
public async Task<ActionResult> UploadDocument([FromForm]DataWrapper data)
{
IFormFile file = data.File;
string fileName = file.FileName;
long length = file.Length;
if (length < 0)
return BadRequest();
using FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate);
byte[] bytes = new byte[length];
fileStream.Read(bytes, 0, (int)file.Length);
...
}
但是,在这行代码执行之后,有些地方出现了问题:
fileStream.Read(bytes, 0, (int)file.Length);
bytes
的所有元素都为零。
而且,相同名称的文件是在我的Visual项目中创建的,我希望不会发生这种情况。
发布于 2019-11-22 08:51:21
您不能像打开磁盘上的文件那样打开IFormFile
。您将不得不使用IFormFile.OpenReadStream()
代替。医生来了
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, 0, (int)file.Length);
}
fileStream.Read(bytes, 0, (int)file.Length);
显示为空的原因是因为它是空的。IFormFile.Filename
是请求提供的文件的名称,在磁盘上不存在。
发布于 2019-11-22 08:52:39
您的代码的目的似乎是写入FileStream,而不是字节缓冲区。但是,它实际上所做的是创建一个新的空文件,并将其读取到一个已经清除的缓冲区中。从不使用上传的文件。
写入文件
如果您真的想保存该文件,可以使用CopyTo:
using(var stream = File.Create(Path.Combine(folder_I_Really_Want,file.FileName))
{
file.CopyTo(stream);
}
如果希望在不保存到磁盘的情况下将上传的文件读入缓冲区,请使用MemoryStream。这只是一个Stream缓冲区,而不是一个byte[]
缓冲区。您不必指定大小,但这会减少内部缓冲区的重新分配。
将byte[]
读入
通过byte[]读取MemoryStream本质上是相同的:
var stream = new MemoryStream(file.Length);
file.CopyTo(stream);
var bytes=stream.ToArray();
发布于 2019-11-22 09:28:46
问题是,您正在根据模型中的文件名打开一个新的filestream,该文件名将是用户上传时选择的文件名。您的代码将使用该名称创建一个新的空文件,这就是您在文件系统中看到该文件的原因。然后,您的代码将读取该文件中的字节,该文件为空。
您需要使用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://stackoverflow.com/questions/58990439
复制相似问题