C#将IFormFile读入byte []

我正在尝试读取从HTTP POST请求收到的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,(int)file.Length);

        ...

    }

但是在执行此行之后出了点问题:

fileStream.Read(bytes,(int)file.Length);

bytes的所有元素均为零。

此外,在我的Visual Studio项目中创建了具有相同名称的文件,我不希望发生这种情况。

littlejade 回答:C#将IFormFile读入byte []

您无法像打开磁盘上的文件一样打开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

大家都在问