将 HttpPostedFileBase 转换为 byte[]

Posted

技术标签:

【中文标题】将 HttpPostedFileBase 转换为 byte[]【英文标题】:Convert HttpPostedFileBase to byte[] 【发布时间】:2011-12-12 17:15:28 【问题描述】:

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

型号

 public HttpPostedFileBase File  get; set; 

查看

@html.TextBoxFor(m => m.File, new  type = "file" )

一切正常..但我正在尝试将结果字段转换为字节[]。我该怎么做

控制器

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

【问题讨论】:

【参考方案1】:

正如 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();

【讨论】:

第一个示例在 .NET4 中对我不起作用(没有尝试另一个) - 当我使用 .png 或 .jpg 尝试它时它不起作用,但是它确实起作用了当我使用 .txt 文件时工作。知道为什么:) @VoodooChild:大概你正在做的某事是将数据视为文本。我需要查看更多代码才能知道是什么。我建议你再问一个问题,给出你的完整场景。 好的,这对我有用,只是为了提供一些上下文 - 谢谢! ` 图像 img = Image.FromStream(file.InputStream);内存流毫秒 = 新的内存流(); img.Save(ms, ImageFormat.Jpeg); model.SiteLogo = ms.ToArray();` 我发现输入流的位置在流的末尾,所以我必须在 Jon 的代码之前添加行 model.File.InputStream.Position = 0; 以使其工作 @UweKeim:是的,我们已经为inputStream 提供了一个 using 语句(不是指令,顺便说一句),并且两者都将引用同一个对象。为什么要处理两次?【参考方案2】:

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

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 方法。您可能会发现 following blog post 很有用。

【讨论】:

HttpPostedFileBase 的 InputStream 是否保证 在一次调用 Read 时返回其所有数据?最好尽可能避免这种情况。 我发现这只有在我重置两行之间的图像流中的位置时才有效: byte[] image = new byte[file.ContentLength];文件.InputStream.Position = 0; ile.InputStream.Read(image, 0, image.Length);【参考方案3】:
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))

【讨论】:

以上是关于将 HttpPostedFileBase 转换为 byte[]的主要内容,如果未能解决你的问题,请参考以下文章

无法将 HttpPostedFileBase 保存到会话变量并使用两次

使用 jquery ajax 发布时,Httppostedfilebase 始终返回 null

当通过ajax mvc上传文件HttpPostedFileBase时返回null

如何更改 httppostedfilebase 的内容类型?

如何将 JsonString 和 HttpPostedFileBase 图片发布到 Web 服务?

base64 编码 HttpPostedFileBase