【问题标题】:Best way to save a Stream to a file in asp.net 3.5?将流保存到 asp.net 3.5 中的文件的最佳方法?
【发布时间】:2009-02-22 05:18:04
【问题描述】:

我有一个 Stream 对象,其中填充了 XSD 文件的内容,作为我正在处理的项目中的嵌入式资源,如下所示:

using ( Stream xsdStream = assembly.GetManifestResourceStream( xsdFile ) )
{
  // Save the contents of the xsdStream here...
}

在这个 using 块中,我想通过 Web 上的“保存文件”对话框提示用户,他们可以在其中选择保存流中包含的这个 XSD 文件。

实现这一目标的最佳方法是什么?我完全迷失了,谷歌似乎无法用正确的术语来获得相关的答案。

谢谢!

【问题讨论】:

    标签: c# asp.net resources stream


    【解决方案1】:

    如果您不使用 AJAX,则可以使用 Response.WriteFile。否则我会使用 MemoryStream。我就是这样做的here。抱歉,它在 VB.NET 中,我没有对其进行转码。请注意,这还允许您通过网络服务器下载文件,即,如果您的文件位于没有公共访问权限的应用服务器上。

    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.Sql
    Imports System.Net
    Imports System.IO
    
    Partial Class DownloadFile
    Inherits System.Web.UI.Page
    
    Protected Sub page_load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    Dim url As String = Request.QueryString("DownloadUrl")
    If url Is Nothing Or url.Length = 0 Then Exit Sub
    
    'Initialize the input stream
    Dim req As HttpWebRequest = WebRequest.Create(url)
    Dim resp As HttpWebResponse = req.GetResponse()
    Dim bufferSize As Integer = 1 
    
    'Initialize the output stream
    Response.Clear()
    Response.AppendHeader("Content-Disposition:", "attachment; filename=download.zip")
    Response.AppendHeader("Content-Length", resp.ContentLength.ToString)
    Response.ContentType = "application/download"
    
    'Populate the output stream
    Dim ByteBuffer As Byte() = New Byte(bufferSize) {}
    Dim ms As MemoryStream = New MemoryStream(ByteBuffer, True)
    Dim rs As Stream = req.GetResponse.GetResponseStream()
    Dim bytes() As Byte = New Byte(bufferSize) {}
    While rs.Read(ByteBuffer, 0, ByteBuffer.Length) > 0
    Response.BinaryWrite(ms.ToArray())
    Response.Flush()
    End While
    
    'Cleanup
    Response.End()
    ms.Close()
    ms.Dispose()
    rs.Dispose()
    ByteBuffer = Nothing
    End Sub
    End Class
    

    【讨论】:

      【解决方案2】:

      您需要设置内容配置:

      Response.AddHeader "Content-Disposition","attachment; filename=" & xsdFile
      

      您还需要将 Content-Type 设置为 text/plain 并将 Content-Length 设置为文件的大小。然后你写文件的内容。

      【讨论】:

      • 虽然这个答案确实提供了有价值的信息,也就是说,如果 Rob 想要推出自己的流媒体,它并没有首先回答有关如何流式传输文件的问题。如果 Rob 想那样做,我认为 tsilb 有更好的答案。但是我仍然认为我的方式要容易得多... ;)
      【解决方案3】:
      private void DownloadEmbeddedResource( 
        string resourceName, Assembly resourceAssembly, string downloadFileName )
      {
        using ( Stream stream = resourceAssembly.GetManifestResourceStream( resourceName ) )
        {
          if ( stream != null )
          {
            Response.Clear();
            string headerValue = string.Format( "attachment; filename={0}", downloadFileName );
            Response.AppendHeader( "Content-Disposition:", headerValue );
            Response.AppendHeader( "Content-Length", stream.Length.ToString() );
            Response.ContentType = "text/xml";
      
            var byteBuffer = new Byte[1];
      
            using ( var memoryStream = new MemoryStream( byteBuffer, true ) )
            {
              while ( stream.Read( byteBuffer, 0, byteBuffer.Length ) > 0 )
              {
                Response.BinaryWrite( memoryStream.ToArray() );
                Response.Flush();
              }
            }
      
            Response.End();
          }
        }
      }
      

      我最终使用了上面的这种方法。感谢您在语法 tsilb 方面帮助我。 JohannesH,如果资源不是来自不同的程序集,我会使用你的建议(对不起,我应该在我原来的问题中澄清这一点)。

      上面的代码有效,但我遇到了一个相当奇怪的问题......方法完成并下载完成后,页面似乎仍然没有恢复活力,鼠标仍然处于沙漏模式,就像它仍然认为的那样工作正在进行中。关于如何补救的任何想法?

      再次感谢您的帮助!

      【讨论】:

        【解决方案4】:

        在我看来,您应该看看 WebResource.axd 处理程序。

        微软在这个主题上有一个出色的article

        编辑:

        似乎 tsilb 比我的回答快了一分钟左右。但是,AssemblyResourceLoader(又名 WebResource.axd)已经实现为您执行此操作并正确执行此操作,并且不要忘记此小狗支持输出缓存。因此,请继续使用它,以免麻烦。 ;)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-07
          • 1970-01-01
          • 2014-07-12
          • 1970-01-01
          • 1970-01-01
          • 2013-09-22
          • 1970-01-01
          • 2015-08-23
          相关资源
          最近更新 更多