将HttpPostedFileBase转换为byte []


123

在我的MVC应用程序中,我正在使用以下代码上传文件。

模型

 public HttpPostedFileBase File { get; set; }

视图

@Html.TextBoxFor(m => m.File, new { type = "file" })

一切正常..但是我试图将结果字段转换为byte []。我该怎么做

控制器

 public ActionResult ManagePhotos(ManagePhotos model)
    {
        if (ModelState.IsValid)
        {
            byte[] image = model.File; //Its not working .How can convert this to byte array
        }
     }

Answers:


259

正如Darin所说,您可以从输入流中读取信息-但我会避免一次依赖所有可用数据。如果您使用的是.NET 4,这很简单:

MemoryStream target = new MemoryStream();
model.File.InputStream.CopyTo(target);
byte[] data = target.ToArray();

CopyTo如果需要,编写.NET 3.5中的等效代码非常容易。重要的部分是您从中阅读HttpPostedFileBase.InputStream

为了提高效率,您可以检查返回的流是否已经是MemoryStream

byte[] data;
using (Stream inputStream = model.File.InputStream)
{
    MemoryStream memoryStream = inputStream as MemoryStream;
    if (memoryStream == null)
    {
        memoryStream = new MemoryStream();
        inputStream.CopyTo(memoryStream);
    }
    data = memoryStream.ToArray();
}

第一个示例在.NET4中对我不起作用(没有尝试其他示例)-当我使用.png或.jpg尝试时,它不起作用,但是当我使用.txt文件时,它起作用了。任何想法为什么:)
VoodooChild

2
@VoodooChild:大概的东西在你正在做的是处理数据的文本内容。我需要查看更多代码才能知道。我建议您再问一个完整的情况。
乔恩·斯基特

6
好的,这对我有用,只是提供一些背景信息-谢谢!`Image img = Image.FromStream(file.InputStream); MemoryStream ms =新的MemoryStream(); img.Save(ms,ImageFormat.Jpeg); model.SiteLogo = ms.ToArray();`
VoodooChild

7
我发现inputstream的位置在流的末尾,因此我不得不model.File.InputStream.Position = 0;在Jon的代码之前添加一行以使其起作用
Manish 2014年

2
@UweKeim:是的,我们已经有一个using语句(不是伪指令,btw)inputStream,并且都将引用同一个对象。您为什么要处置两次?
乔恩·斯基特

27

您可以从输入流中读取它:

public ActionResult ManagePhotos(ManagePhotos model)
{
    if (ModelState.IsValid)
    {
        byte[] image = new byte[model.File.ContentLength];
        model.File.InputStream.Read(image, 0, image.Length); 

        // TODO: Do something with the byte array here
    }
    ...
}

如果打算将文件直接保存到磁盘,则可以使用该model.File.SaveAs方法。您可能会发现以下博客文章很有用。


5
是否可以确保 HttpPostedFileBase的InputStream 在一次Read调用中返回其所有数据?最好尽可能避免这种情况。
乔恩·斯基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.