【问题标题】:ASP.Net MVC - Read File from HttpPostedFileBase without saveASP.Net MVC - 从 HttpPostedFileBase 读取文件而不保存
【发布时间】:2013-04-08 10:39:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: file c#-4.0 file-io asp.net-mvc-2 stream


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

    【讨论】:

    • 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(); }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-06
        相关资源
        最近更新 更多