将HttpPostedFileBase转换为byte[]

138
在我的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
        }
     }
3个回答

275

正如Darin所说,你可以从输入流中读取数据,但我建议不要仅仅依赖于一次读取就能获取全部数据。如果你使用的是.NET 4,那么很简单:

像这样:

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

如果需要的话,在.NET 3.5中编写等效于CopyTo的方法是相当容易的。重要的部分是你要从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();
}

1
第一个示例在.NET4中对我无效(没有尝试另一个)- 当我尝试使用.png或.jpg时它不起作用,但是当我使用.txt文件时它有效。有什么想法为什么 :) - VoodooChild
2
@VoodooChild:很可能是你所做的某些事情将数据视为文本。不过,我需要看更多的代码才能确定。我建议你提出另一个问题,给出你完整的场景。 - Jon Skeet
6
这对我有用,提供一些背景信息- 谢谢! MemoryStream ms = new MemoryStream(); img.Save(ms, ImageFormat.Jpeg); model.SiteLogo = ms.ToArray();``` - VoodooChild
9
我发现输入流的位置在流的末尾,所以我必须在Jon的代码之前添加一行 model.File.InputStream.Position = 0; 才能让它正常工作。 - Manish
2
@UweKeim:是的,我们已经为inputStream有了一个using语句(顺便说一下,不是指令),两者都将引用同一个对象。你为什么想要两次处理它? - Jon Skeet
显示剩余9条评论

31
你可以从输入流中读取它。
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 方法。你可能会发现这篇博客文章很有用。


6
HttpPostedFileBase的InputStream是否保证在一次Read调用中返回所有数据?最好在可能的情况下避免这样做。 - Jon Skeet
我发现只有在这两行之间重置图像流的位置时,它才能正常工作:byte[] image = new byte[file.ContentLength]; file.InputStream.Position = 0;ile.InputStream.Read(image, 0, image.Length); - Andy Brown

0
byte[] file = new byte[excelFile.ContentLength];
excelFile.InputStream.Read(file, 0, file.Length);

//Create memory stream object from your bytes
MemoryStream ms = new MemoryStream(file);

// Set WorkbookPart , Sheet
using (var myDoc = DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(ms, true))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接