【问题标题】:Trouble with Response.WriteFile / Response.BinaryWrite / Response.TransmitFile (ASP.NET)Response.WriteFile / Response.BinaryWrite / Response.TransmitFile (ASP.NET) 出现问题
【发布时间】:2012-03-29 01:15:18
【问题描述】:

我有一个简单的网页,它生成一个 CSV 文件,我希望用户在创建完成后能够下载该文件。

我的情况总结如下:

  1. CSV 文件可以在内存中或磁盘上创建。对我来说无所谓。
  2. 完成 CSV 文件传输后,我不希望它继续驻留在磁盘上。
  3. 我尝试了使用 Response.WriteFile、.TransmitFile、.BinaryWrite 和 .Write 的各种代码,但无济于事。
  4. 当我说 “无济于事” 时,我的意思是不是传输 CSV 文件,而是传输 CSV 文件的内容加上整个当前页面!
  5. 我真的很困惑,因为我有另一个页面基本上做同样的事情,但是 PDF 文件捆绑在一个 zip 文件中,而且它工作得很好。
  6. 我确实是一名 Windows 桌面开发人员,但我正在努力成为一名 Web 开发人员。 (很抱歉,如果这是一个愚蠢或菜鸟的问题。)

这是我用来发送包含 PDF 文件的 .zip 的代码:

Protected Sub SaveReportsButton_Click(sender As Object, e As EventArgs) Handles SaveReportsButton.Click
    '' The .zip file is created elsewhere
    Dim fullPath As String = Server.MapPath("~/Reports/" & Session.SessionID & ".zip")
    Response.ContentType = "APPLICATION/OCTET-STREAM"
    Dim fileToDownload As New FileInfo(fullPath)
    Dim disHeader As String = "Attachment; Filename=""Reports.zip"""
    Response.AppendHeader("Content-Disposition", disHeader)
    Response.Flush()
    Response.WriteFile(fileToDownload.FullName)
End Sub

这是我正在尝试传输 CSV 文件的代码:

Protected Sub saveButton_Click(sender As Object, e As System.EventArgs) Handles SaveOutput.Click
    Dim list As List(Of String) = {"000000000", "000000000", "000000000"}.ToList()
    Dim sb As New Text.StringBuilder
    For i As Integer = 0 To list.Count - 1
        Dim str As String = list(i)
        sb.Append(str)
        If i < list.Count - 1 Then
            sb.Append(",")
        End If
    Next
    Dim dirPath As String = Server.MapPath("~/Output/" & Session.SessionID)
    IO.Directory.CreateDirectory(dirPath)
    Dim filePath As String = Server.MapPath("~/Output/" & Session.SessionID & "/Output.csv")
    IO.File.WriteAllText(filePath, sb.ToString())
    Response.ContentType = "text/csv"
    Dim disHeader As String = "Attachment; Filename=""Output.csv"""
    Response.AppendHeader("Content-Disposition", disHeader)
    Response.Flush()
    Response.WriteFile(filePath)
End Sub

就像我说的,我希望限制此页面在服务器上创建和保留的文件,所以我想在完成后删除 CSV 文件。

有什么帮助吗?

谢谢!!!

【问题讨论】:

    标签: asp.net response writefile transmitfile


    【解决方案1】:

    用 Response.Write 和 Response.End 试试这个

    Protected Sub saveButton_Click(sender As Object, e As System.EventArgs) Handles SaveOutput.Click
        Dim list As List(Of String) = {"000000000", "000000000", "000000000"}.ToList()
        Dim sb As New Text.StringBuilder
        For i As Integer = 0 To list.Count - 1
            Dim str As String = list(i)
            sb.Append(str)
            If i < list.Count - 1 Then
                sb.Append(",")
            End If
        Next
        Response.Clear()
        Response.ContentType = "text/csv"
        Dim disHeader As String = "Attachment; Filename=""Output.csv"""
        Response.AppendHeader("Content-Disposition", disHeader)
        Response.Flush()
        Response.Write(sb.ToString())
        Response.End()
    End Sub
    

    【讨论】:

      【解决方案2】:

      您根本不需要保存此文件。为什么不直接返回响应,仅此而已。如果您不创建文件,则无需担心删除它。

      内容是动态创建的。

      更新

      设置响应头“content-disposition”,然后写入 Response.OutputStream

      在此处了解有关响应标头的更多信息http://www.jtricks.com/bits/content_disposition.html

      就 c# 代码而言,做类似的事情

      Response.AddHeader("content-disposition", string.Format("filename={0}", fileName));
      using (var myWriter = new SOMETHING_WHICH_CAN_WRITE_TO_STREAM())
      {
          myWriter.Write(Response.OutputStream);
      }
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多