Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将文件读入字节[]_C#_Filestream_Iformfile - Fatal编程技术网

C#将文件读入字节[]

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

我正在尝试读取从HTTP POST请求接收到的
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());
            }
        }