Проблема с Response.WriteFile / Response.BinaryWrite / Response.TransmitFile (ASP.NET)
У меня есть простая веб-страница, которая генерирует CSV-файл, который я хочу, чтобы пользователь мог загрузить после завершения его создания.
Вот краткое изложение моей ситуации:
- Файл CSV может быть создан в памяти или на диске. Не имеет значения для меня.
- После завершения передачи файла CSV я не хочу, чтобы он продолжал находиться на диске.
- Я пробовал различный код, используя Response.WriteFile, .TransmitFile, .BinaryWrite и.Write, но безрезультатно.
- Когда я говорю "безрезультатно", я имею в виду, что вместо того, чтобы передавать файл CSV, я передаю содержимое файла CSV, а также всю текущую страницу!
- Я действительно сбит с толку, так как у меня есть другая страница, которая делает по сути то же самое, но с PDF-файлами, упакованными в zip-файл, и это работает просто отлично.
- Я действительно разработчик для 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 ответа
Попробуйте это с 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
Вам не нужно сохранять этот файл вообще. Почему бы вам просто не вернуть ответ и все? Если вы не создаете файл, вам не нужно беспокоиться об его удалении.
Контент создается на лету.
ОБНОВИТЬ
установите заголовок ответа "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);
}
Надеюсь, поможет