代码之家  ›  专栏  ›  技术社区  ›  Adam Neal

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

  •  0
  • Adam Neal  · 技术社区  · 17 年前

    我有一个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
    

    我错过了什么?我需要使用其他标头吗?我发现了这个 unanswered question on the ASP.NET forums

    2 回复  |  直到 17 年前
        1
  •  2
  •   olle    17 年前

    您不能在同一响应中发回文件和新页面。

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

        2
  •  2
  •   lance    17 年前

    你不能。你可以通过点击按钮打开一个弹出窗口来伪造这种行为,让弹出窗口提供文件并从javascript发回页面。但通过这种方式,您实际上创建了2个请求和2个响应。

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

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

    推荐文章