如何在HTTP响应中发送文件和页面?

时间:2009-08-28 21:24:48

标签: asp.net http-headers response

我有一个ASP.NET页面,我正在生成一个Excel电子表格并在响应中发送它(内容处置标题)。该部分工作得很好,但我有一个永远不会重新启用的按钮,因为原始页面不是响应的一部分。

这是我正在使用的功能:

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse)
    Dim theStream As New System.IO.MemoryStream()
    theWorkBook.Save(theStream)

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte())

    theStream.Position = 0
    theStream.Read(byteArr, 0, CInt(theStream.Length))
    theStream.Close()

    resp.Clear()
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName)
    resp.BinaryWrite(byteArr)
    resp.End()
End Sub

我尝试不清除响应并使用AppendHeader而不是AddHeader,但响应仍然只包含文件。

我错过了什么?我需要使用不同的标题吗?我找到了unanswered question on the ASP.NET forums;听起来像我的问题。

2 个答案:

答案 0 :(得分:2)

您无法在同一回复中发回文件和新页面。

我不确定该解决方案如何满足您的特定需求,但请记住,您可以使用Javascript启用或禁用之前的按钮将文件创建请求发送到 / em>服务器(这样,在用户开始下载电子表格时,按钮已经处于您想要的状态)。

答案 1 :(得分:2)

你做不到。您可以通过单击按钮打开弹出窗口并让弹出窗口提供文件并从javascript回发页面来伪造行为。但是通过这种方式,您可以有效地创建2个请求,包含2个响应。

更新:如果您想在开始下载时禁用该按钮,并在下载开始后立即启用该按钮,您就无法真正做到这一点,但您可以使用一些技巧使它看起来像这样。当他们点击下载按钮时,使用一些javascript来禁用该按钮并创建启动文件流的弹出窗口。当文件流功能(WriteToResponse)返回时,在用户会话中设置一些值。同时,原始页面使用AJAX轮询服务器以查看是否设置了会话值。如果设置了重新启用按钮并再次将值设置为空或假(这样第二次工作)。但这似乎有很多伎俩。

但我认为在这种情况下治愈比问题更糟糕。我假设您想要这个,因为生成文件需要一段时间,并且您不希望用户在准备文件时不耐烦地按下按钮来重置流。为了做到这一点,我只会在按下按钮的页面中显示一条弹出消息,上面写着“您的下载正在准备中。这可能需要一分钟。感谢您的耐心等待。(点击忽略此消息)”