首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#将IFormFile读入byte[]

C#将IFormFile读入byte[]
EN

Stack Overflow用户
提问于 2019-11-22 08:42:27
回答 3查看 14.2K关注 0票数 7

我试图读取从HTTP请求中接收到的IFormFile,如下所示:

代码语言:javascript
运行
复制
 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);

        ...

    }

但是,在这行代码执行之后,有些地方出现了问题:

代码语言:javascript
运行
复制
fileStream.Read(bytes, 0, (int)file.Length);

bytes的所有元素都为零。

而且,相同名称的文件是在我的Visual项目中创建的,我希望不会发生这种情况。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-22 08:51:21

您不能像打开磁盘上的文件那样打开IFormFile。您将不得不使用IFormFile.OpenReadStream()代替。医生来了

代码语言:javascript
运行
复制
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是请求提供的文件的名称,在磁盘上不存在。

票数 12
EN

Stack Overflow用户

发布于 2019-11-22 08:52:39

您的代码的目的似乎是写入FileStream,而不是字节缓冲区。但是,它实际上所做的是创建一个新的空文件,并将其读取到一个已经清除的缓冲区中。从不使用上传的文件。

写入文件

如果您真的想保存该文件,可以使用CopyTo

代码语言:javascript
运行
复制
using(var stream = File.Create(Path.Combine(folder_I_Really_Want,file.FileName))
{
    file.CopyTo(stream);
}

如果希望在不保存到磁盘的情况下将上传的文件读入缓冲区,请使用MemoryStream。这只是一个Stream缓冲区,而不是一个byte[]缓冲区。您不必指定大小,但这会减少内部缓冲区的重新分配。

byte[]读入

通过byte[]读取MemoryStream本质上是相同的:

代码语言:javascript
运行
复制
var stream = new MemoryStream(file.Length);
file.CopyTo(stream);
var bytes=stream.ToArray();
票数 3
EN

Stack Overflow用户

发布于 2019-11-22 09:28:46

问题是,您正在根据模型中的文件名打开一个新的filestream,该文件名将是用户上传时选择的文件名。您的代码将使用该名称创建一个新的空文件,这就是您在文件系统中看到该文件的原因。然后,您的代码将读取该文件中的字节,该文件为空。

您需要使用IFormFile.OpenReadStream方法或CopyTo方法之一从流中获取实际数据。

然后,以所需的名称将该数据写入文件系统中的文件中。

代码语言:javascript
运行
复制
        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());
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58990439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档