2012-03-12 4 views
2

У меня есть простая веб-страница, которая генерирует CSV-файл, который я хочу, чтобы пользователь мог загрузить после завершения его создания ,Проблема с Response.WriteFile/Response.BinaryWrite/Response.TransmitFile (ASP.NET)

Вот краткое описание моей ситуации:

  1. Файл CSV можно создать в памяти или на диске. Не имеет значения для меня.
  2. Как только я закончил передачу CSV-файла, я не хочу, чтобы он продолжал оставаться на диске.
  3. Я пробовал различный код с помощью Response.WriteFile, .TransmitFile, .BinaryWrite и .Write, но безрезультатно.
  4. Когда я говорю «без толка», я имею в виду, что вместо файла CSV передается, я передача содержимого CSV файла PLUS Целостности текущей страница!
  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 файл, как только я Я сделал с ним.

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

Спасибо !!!

ответ

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 
+0

OP необходимо передавать без создания файла ... – Pankaj

+0

Отредактировано код, чтобы избежать создания файла – PraveenVenu

0

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

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

UPDATE

набор заголовка ответа "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); 
} 

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

+0

не могли бы вы разместить несколько примеров кода или ссылки? – Pankaj