将HttpPostedFileBase转换为byte []

Nul*_*ter 116 arrays image asp.net-mvc-3

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

模型

 public HttpPostedFileBase File { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图

@Html.TextBoxFor(m => m.File, new { type = "file" })
Run Code Online (Sandbox Code Playgroud)

一切工作正常..但我试图将结果fiel转换为byte [].我怎么能这样做

CONTROLLER

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

Jon*_*eet 245

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

MemoryStream target = new MemoryStream();
model.File.InputStream.CopyTo(target);
byte[] data = target.ToArray();
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现输入流位置在流的末尾,所以我必须在Jon的代码之前添加行`model.File.InputStream.Position = 0;`以使其工作 (7认同)
  • 好的,这对我有用,只是为了给出一些背景 - 谢谢!`Image img = Image.FromStream(file.InputStream); MemoryStream ms = new MemoryStream(); img.Save(ms,ImageFormat.Jpeg); model.SiteLogo = ms.ToArray();` (6认同)
  • @VoodooChild:据推测,你正在做的事情是将数据视为文本.我需要看到更多的代码才能知道.我建议你提出另一个问题,给出完整的方案. (2认同)
  • @UweKeim:是的,我们已经为`inputStream`获得了一个using语句(不是指令,btw),两者都将引用同一个对象.你为什么要两次处理它? (2认同)

Dar*_*rov 26

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

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
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • HttpPostedFileBase*的*的InputStream是否在一次调用Read中返回其所有数据?最好尽可能避免这种情况. (5认同)