ASP.Net MVC - 从HttpPostedFileBase读取文件而不保存

Man*_*aju 61 file-io file stream c#-4.0 asp.net-mvc-2

我正在使用文件上传选项上传文件.我在POST方法中直接将此文件从View发送到Controller,如,

    [HttpPost]
    public ActionResult Page2(FormCollection objCollection)
    {
        HttpPostedFileBase file = Request.Files[0];
    }
Run Code Online (Sandbox Code Playgroud)

假设,我正在上传记事本文件.我如何阅读此文件并将此文本附加到字符串生成器,而不保存该文件....

我知道在SaveAs这个文件之后,我们可以读取这个文件.但是如何在HttpPostedFileBase不保存的情况下读取此文件?

Tha*_*amy 75

这可以使用httpPostedFileBase类按照此处指定的方式返回HttpInputStreamObject来完成

您应该将流转换为字节数组,然后您可以读取文件内容

请参考以下链接

http://msdn.microsoft.com/en-us/library/system.web.httprequest.inputstream.aspx ]

希望这可以帮助

更新:

从HTTP调用获得的流是只读顺序(不可搜索),FileStream是可读/可搜索的.首先需要将HTTP调用中的整个流读入字节数组,然后从该数组中创建FileStream.

取自这里

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 微小的修改,ContentLength在file.ContentLength,而不是file.InputStream.ContentLength (5认同)
  • PS b.ReadBytes()想要一个int但是file.InputStream.Length是一个long (4认同)
  • 但file.InputStream.ContentLength是一个int (2认同)

Ric*_* YS 42

另一种方法是使用StreamReader.

public void FunctionName(HttpPostedFileBase file)
{
    string result = new StreamReader(file.InputStream).ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)

  • 同意,但在很多情况下,这是可以的. (4认同)
  • 虽然+1,但你并没有处理掉"IDisposable". (2认同)

Sti*_*tig 9

Thangamani Palanisamy回答略有变化,允许Binary读者处理并在他的评论中纠正输入长度问题.

string result = string.Empty;

using (BinaryReader b = new BinaryReader(file.InputStream))
{
  byte[] binData = b.ReadBytes(file.ContentLength);
  result = System.Text.Encoding.UTF8.GetString(binData);
}
Run Code Online (Sandbox Code Playgroud)