C#将文件读入字节[]
我正在尝试读取从HTTP POST请求接收到的C#将文件读入字节[],c#,filestream,iformfile,C#,Filestream,Iformfile,我正在尝试读取从HTTP POST请求接收到的ifformfile,如下所示: public async Task<ActionResult> UploadDocument([FromForm]DataWrapper data) { IFormFile file = data.File; string fileName = file.FileName; long length = file.Length; if
ifformfile
,如下所示:
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);
...
}
字节的所有元素都是零
另外,同名文件是在我的Visual Studio项目中创建的,我不希望发生这种情况。您不能像打开磁盘上的文件一样打开格式文件。您必须改用ifformfile.OpenReadStream()
public异步任务上载文档([FromForm]DataWrapper数据)
{
ifformfile file=data.file;
long length=file.length;
如果(长度<0)
返回请求();
使用var fileStream=file.OpenReadStream();
字节[]字节=新字节[长度];
读取(字节,0,(int)file.Length);
}
fileStream.Read(字节,0,(int)file.Length)的原因代码>似乎是空的,因为它是空的。ifformfile.Filename
是请求提供的文件名,在磁盘上不存在。您的代码的目的似乎是写入文件流,而不是字节缓冲区。但它实际上做的是创建一个新的空文件,并将其读取到一个已清除的缓冲区中。上载的文件从未使用过
写入文件
如果确实要保存文件,可以使用:
如果要将上传的文件读取到缓冲区而不保存到磁盘,请使用MemoryStream。这只是字节[]
缓冲区上的流API缓冲区。您不必指定大小,但这会随着内部缓冲区的增长而减少重新分配
读取字节[]
通过MemoryStream读取字节[]本质上是相同的:
var stream = new MemoryStream(file.Length);
file.CopyTo(stream);
var bytes=stream.ToArray();
问题是,您正在根据模型中的文件名打开一个新的filestream,该文件名将是用户在上载时选择的文件名。您的代码将使用该名称创建一个新的空文件,这就是您在文件系统中看到该文件的原因。然后,代码将从该文件中读取空的字节
您需要使用ifformfile.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());
}
}
您是要写入文件还是直接读取缓冲区?您的代码正在创建一个空文件并从中读取。它从不尝试读取上传的文件
using(var stream = File.Create(Path.Combine(folder_I_Really_Want,file.FileName))
{
file.CopyTo(stream);
}
var stream = new MemoryStream(file.Length);
file.CopyTo(stream);
var bytes=stream.ToArray();
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());
}
}