【问题标题】:Convert HttpPostedFileBase to byte[]将 HttpPostedFileBase 转换为 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
        }
     }

【问题讨论】:

    标签: arrays image asp.net-mvc-3


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多