将流保存到asp.net 3.5中的文件的最佳方法?


3

我有一个填充了XSD文件我已经为一个项目我的工作,像这样的嵌入式资源内容的Stream对象:使用块

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

在此,我想提示用户在网上有一个“保存文件”对话框,他们可以选择保存流中包含的这个XSD文件。

完成此操作的最佳方法是什么?我完全迷失了,Google似乎无法得到相关答案。

谢谢!

2

如果你不使用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 

0

这听起来应该看看WebResource.axd处理程序。

微软在这方面拥有出色的article

编辑:

似乎tsilb用一分钟左右,打我的答案。然而,AssemblyResourceLoader(aka.WebResource.axd)已经实现为你做这个并且正确地做到了,不要忘记这只小狗支持输出缓存。因此,请继续使用,并省去麻烦。 ;)


1

您将要设置的内容处置:

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

您还需要设置内容类型为text /平原和内容长度的文件的大小。然后你写下文件的内容。

  0

虽然这个答案确实提供了有价值的信息,那就是说,如果Rob想推出他自己的流媒体,它并没有回答关于如何流式传输文件的问题。如果罗布想这样做,我认为锡尔布有更好的答案。不过,我仍然认为我的方式更容易...;) 22 2月. 092009-02-22 06:30:17


1
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,如果资源不是来自另一个程序集的话,我会使用你的建议(对不起,我应该在原始问题中清除它)。

上面的代码工作,但我遇到了一个相当奇怪的问题...方法完成后,下载完成后,页面仍然不会恢复生活,鼠标仍然处于沙漏模式,仍然像它仍然认为工作正在完成。任何想法如何补救?

再次感谢您的帮助!