Проблема с Response.WriteFile / Response.BinaryWrite / Response.TransmitFile (ASP.NET) - PullRequest
2 голосов
/ 12 марта 2012

У меня есть простая веб-страница, которая генерирует CSV-файл, который я хочу, чтобы пользователь мог загрузить после завершения его создания.

Вот краткий обзор моей ситуации:

  1. Файл CSV может быть создан в памяти или на диске.Не имеет значения для меня.
  2. Как только я закончу передачу файла CSV, я не хочу, чтобы он продолжал находиться на диске.
  3. Я пробовал различный код, используя Response.WriteFile, .TransmitFile, .BinaryWrite и .Write, но безрезультатно.
  4. Когда я говорю «безрезультатно» , я имею в виду, что вместо передаваемого файла CSV япередача содержимого файла CSV ПЛЮС НА ОКРУЖАЮЩУЮ СРЕДНЮЮ СТРАНИЦУ!
  5. Я действительно сбит с толку, так как у меня есть другая страница, которая делает то же самое,но с PDF-файлами, упакованными в zip-файл, и это прекрасно работает.
  6. Я действительно разработчик настольных систем Windows, но я пытаюсь стать веб-разработчиком.(Извините, если это глупый вопрос или вопрос новичка.)

Вот код, который у меня работает для отправки .zip, содержащего файлы PDF:

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, как только я закончу с ним.

Любая помощь?

Спасибо !!!

Ответы [ 2 ]

1 голос
/ 12 марта 2012

попробуйте это с помощью 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
0 голосов
/ 12 марта 2012

Вам не нужно вообще сохранять этот файл.Почему бы вам просто не вернуть ответ и все?Если вы не создаете файл, вам не нужно беспокоиться об его удалении.

Содержимое создается на лету.

ОБНОВЛЕНИЕ

установить заголовок ответа "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);
}

Надеюсь, это поможет

...