ASP.Net MVC - 从 HttpPostedFileBase 读取文件而不保存
Posted
技术标签:
【中文标题】ASP.Net MVC - 从 HttpPostedFileBase 读取文件而不保存【英文标题】:ASP.Net MVC - Read File from HttpPostedFileBase without save 【发布时间】:2013-04-08 10:39:41 【问题描述】:我正在使用文件上传选项上传文件。我直接在 POST 方法中将这个文件从 View 发送到 Controller,
[HttpPost]
public ActionResult Page2(FormCollection objCollection)
HttpPostedFileBase file = Request.Files[0];
假设,我正在上传一个记事本文件。我如何阅读此文件并将此文本附加到字符串生成器,而不保存该文件....
我知道SaveAs
这个文件之后,我们可以读取这个文件。但是我如何在不保存的情况下从HttpPostedFileBase
读取这个文件?
【问题讨论】:
【参考方案1】:这可以使用 httpPostedFileBase 类返回 HttpInputStreamObject 根据指定的here
您应该将流转换为字节数组,然后您可以读取文件内容
请参考以下链接
http://msdn.microsoft.com/en-us/library/system.web.httprequest.inputstream.aspx]
希望对你有帮助
更新:
您从 HTTP 调用获得的流是只读顺序的 (不可搜索)并且 FileStream 是可读写的。你会 需要首先从 HTTP 调用中读取整个流到一个字节 数组,然后从该数组创建 FileStream。
取自here
// Read bytes from http input stream
BinaryReader b = new BinaryReader(file.InputStream);
byte[] binData = b.ReadBytes(file.ContentLength);
string result = System.Text.Encoding.UTF8.GetString(binData);
【讨论】:
meta.stackexchange.com/questions/8231/… P.S. b.ReadBytes() 想要一个 int 但 file.InputStream.Length 很长 但 file.InputStream.ContentLength 是一个 int 微小的修改,ContentLength 在 file.ContentLength 上,而不是 file.InputStream.ContentLength【参考方案2】:另一种方法是使用 StreamReader。
public void FunctionName(HttpPostedFileBase file)
string result = new StreamReader(file.InputStream).ReadToEnd();
【讨论】:
这将清空制作文件的流。Length = 0 同意,但在很多情况下这是可以的。 虽然 +1,但您并没有处理IDisposable
。【参考方案3】:
对 Thangamani Palanisamy 答案的细微更改,允许处理二进制读取器并更正其 cmets 中的输入长度问题。
string result = string.Empty;
using (BinaryReader b = new BinaryReader(file.InputStream))
byte[] binData = b.ReadBytes(file.ContentLength);
result = System.Text.Encoding.UTF8.GetString(binData);
【讨论】:
【参考方案4】:字节[] 数据; using(Stream inputStream=file.InputStream) MemoryStream memoryStream = inputStream as MemoryStream; if (memoryStream == null) memoryStream = new MemoryStream(); inputStream.CopyTo(memoryStream); 数据 = memoryStream.ToArray();
【讨论】:
以上是关于ASP.Net MVC - 从 HttpPostedFileBase 读取文件而不保存的主要内容,如果未能解决你的问题,请参考以下文章
从 ASP.NET WebForms 迁移到 ASP.NET MVC 的建议?
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?