【问题标题】:FileUpload to FileStream文件上传到文件流
【发布时间】:2011-03-05 08:12:33
【问题描述】:

我正在与 HttpWebRequest 一起发送文件。我的文件将来自 FileUpload UI。在这里,我需要将文件上传转换为文件流以将流与 HttpWebRequest 一起发送。如何将 FileUpload 转换为文件流?

【问题讨论】:

  • 你到底想达到什么目的?
  • 我需要将文件从一个域传输到另一个域。所以获取上传的文件并使用 HttpWebRequest 发送它

标签: c# asp.net file-upload stream filestream


【解决方案1】:

由于 FileUpload.PostedFile.InputStream 给了我 Stream,我使用以下代码将其转换为字节数组

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[input.Length];
    //byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}

【讨论】:

    【解决方案2】:

    将输入流直接通过管道传输到输出流可能会更好:

    inputStream.CopyTo(outputStream);
    

    这样,您不会在重新传输之前将整个文件缓存在内存中。例如,以下是您将其写入 FileStream 的方式:

    FileUpload fu;  // Get the FileUpload object.
    using (FileStream fs = File.OpenWrite("file.dat"))
    {
        fu.PostedFile.InputStream.CopyTo(fs);
        fs.Flush();
    }
    

    如果您想直接将其写入另一个 Web 请求,您可以执行以下操作:

    FileUpload fu; // Get the FileUpload object for the current connection here.
    HttpWebRequest hr;  // Set up your outgoing connection here.
    using (Stream s = hr.GetRequestStream())
    {
        fu.PostedFile.InputStream.CopyTo(s);
        s.Flush();
    }
    

    这样会更有效率,因为您将直接将输入文件流式传输到目标主机,而无需先缓存在内存或磁盘中。

    【讨论】:

    • 访问 PostedFile 后,该文件已完全被 ASP.NET 缓冲。这只能通过使用HttpRequest.GetBufferlessInputStream()(.NET 4 或更高版本)来规避,但这反过来又需要您自己解析整个请求正文。
    【解决方案3】:

    您无法将 FileUpload 转换为 FileStream。但是,您可以从该 FileUpload 的 PostedFile 属性中获取 MemoryStream。然后,您可以使用该 MemoryStream 来填充您的 HttpWebRequest。

    【讨论】:

    • 能否详细说明 - 可能带有代码示例或链接?
    • @PeterX:请参阅 Extremeswank 的答案作为示例。
    【解决方案4】:

    您可以使用 FileBytes 将 FileUpload 文件直接放入 MemoryStream(来自 Tech Jerk 的简化回答)

    using (MemoryStream ms = new MemoryStream(FileUpload1.FileBytes))
    {
        //do stuff 
    }
    

    或者,如果您不需要 memoryStream

    byte[] bin = FileUpload1.FileBytes;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多