2012-02-24 75 views
0

我正在嘗試爲某些數據創建CSV導出。看起來很簡單,並且在Firefox和Chrome中運行得非常好,但在Internet Explorer中,我只是收到一條消息,說該文件無法下載。沒有其他錯誤消息,Visual Studio中沒有中斷,沒有我可以找到的調試信息。從MVC3導出CSV文件 - Internet Explorer問題

這是我的代碼。也許我做錯了什麼?

public ActionResult ExportStudentsCSV(IEnumerable<Student> students) { 
    MemoryStream output = new MemoryStream(); 
    StreamWriter writer = new StreamWriter(output, System.Text.Encoding.UTF8); 
    writer.WriteLine("Username,Year Level,School Name,State,Date Joined"); 
    foreach (Student student in students) { 
     writer.WriteLine(
        "\"" + student.username 
      + "\",\"" + student.year_level 
      + "\",\"" + student.SchoolName 
      + "\",\"" + student.state 
      + "\",\"" + student.join_date 
      + "\"" 
     ); 
    } 
    writer.Flush(); 
    output.Seek(0, SeekOrigin.Begin); 

    return File(output, "text/csv", "Students_" + DateTime.Now.ToShortDateString().Replace('/', '-') + ".csv"); 
} 

而且我調用這個函數在我的控制器:

return ExportStudentsCSV(model.StudentReport.StudentList); 
+0

@qes好點,感謝 – 2012-02-27 00:09:33

回答

1

它可能看起來不可靠的要回答我的自己的問題,但我認爲我的經驗可能會幫助某人。我做了一些更深入的挖掘,並找到了一種完全替代的方法,使用DataTables和從FileResult繼承的特定CsvActionResult。
看到這個要點:https://gist.github.com/777376

+0

如果連接是SSL,則IE7要求設置不由File或FileContentResult設置的Content-Length標頭。我相信MVC 3和IIS 7會在幕後爲您處理這個問題。但是,當通過SSL連接沒有Content-Length標頭時,使用IE7在IIS 6上下載文件會導致問題。 – James 2012-05-25 17:22:40

2

您可能需要添加一個Content-Disposition頭。

在你ExportStudentsCSV函數返回前,:

var cd = new System.Net.Mime.ContentDisposition(); 
cd.FileName = "filename.csv"; 
Response.AddHeader("Content-Disposition", cd.ToString()); 

或者,如果你寧願短暫它(相當於上面):

Response.AddHeader("Content-Disposition", "attachment;filename=filename.csv"); 
+0

這對IE瀏覽器工作正常,但現在Chrome瀏覽器不會下載,因爲它顯然接收多個內容處置標題,不會允許它。 – 2012-02-27 04:40:50