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

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

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

    我有一个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 回复  |  直到 15 年前
        1
  •  2
  •   olle    15 年前

    你不能。你可以通过点击按钮打开一个弹出窗口,让弹出窗口服务于文件并从javascript发回页面来伪造行为。但是,通过这种方式,您可以有效地创建2个请求和2个响应。

    更新:如果你想在他们开始下载时禁用这个按钮,并在下载一开始就启用它,你不能真的这样做,但你可以使用一些小技巧使它看起来像那样。当他们点击下载按钮时,使用一些javascript来禁用该按钮,并创建一个弹出窗口来启动文件流。当filestreaming函数(writetoresponse)返回时,在用户会话中设置一些值。同时让原始页面使用Ajax对服务器进行轮询,以查看是否设置了会话值。如果设置为“重新启用”按钮并再次将该值设置为空或假(这样第二次有效)。但这似乎是一个完整的技巧。

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

        2
  •  2
  •   lance    15 年前

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

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