2

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

以下是我的情况的摘要:

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

这是我用来发送包含 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 文件。

有什么帮助吗?

谢谢!!!

4

2 回答 2

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
于 2012-03-12T16:13:31.063 回答
0

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

内容是动态创建的。

更新

设置响应头“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);
}

希望能帮助到你

于 2012-03-12T16:15:11.847 回答