将 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 的内容类型?