2011-03-01 53 views
7

我已經嘗試了所有我能想到的。我已經改變了mime類型100次。更改標題400次。我已經翻閱了十多遍。這在Chrome中正常工作。不久,我去Firefox下載它認爲這是一個xlsx文件,或二進制文件。它甚至以xlsx打開,但它不認爲它是一個csv,所以列不分離。如果我保存文件(而不是打開),它甚至不會打開擴展名。我甚至還沒有去過IE,所以這讓我很擔心。Firefox不會將該文件作爲CSV下載

mime mapping 
    <mime-mapping> 
     <extension>csv</extension> 
     <mime-type>application/vnd.ms-excel</mime-type> 
    </mime-mapping> 

我試過text/csv,application/csv,application/binary,application/octet-stream。

public void doDownloadFile() { 

      PrintWriter out = null; 

      try { 

       String fileName = selectedPkgLine.getShortname() + ".csv"; 

       HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
       HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

       response.setHeader("Pragma", "public"); 
       response.setHeader("Expires", "0"); 
       response.setContentType(request.getServletContext().getMimeType(fileName)); 
       response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
       response.setHeader("Content-disposition", "attachment; filename=" + fileName + ""); 
       response.setHeader("Content-Transfer-Encoding", "binary"); 

       out = response.getWriter(); 
       CSVWriter writer = new CSVWriter(out); 

       List<PkgLoad> pkgLoadList = pkgLoadService.findBetweenDates(selectedPkgLine, startDate, endDate); 

       List<String[]> stringList = new ArrayList<String[]>(); 
       stringList.clear(); 

       String[] header = { 
        "pkg_load_id", 
        "time_stamp", 
        "ounces", 
        "revolutions", 
        "wrap_spec_id", 
        "pkg_line_id" 
       }; 

       stringList.add(header); 

       for (PkgLoad pkgLoad : pkgLoadList) { 

        String[] string = { 
         pkgLoad.getPkgLoadId().toString(), 
         pkgLoad.getTimeStamp().toString(), 
         pkgLoad.getOunces().toString(), 
         pkgLoad.getRevolutions().toString(), 
         pkgLoad.getWrapSpecId().getWrapSpecId().toString(), 
         pkgLoad.getPkgLineId().getPkgLineId().toString() 
        }; 
        stringList.add(string); 
       } 

       response.setHeader("Content-length", String.valueOf(stringList.size())); 


       writer.writeAll(stringList); 
       out.flush(); 

      } catch (IOException ex) { 
       Logger.getLogger(ViewLines.class.getName()).log(Level.SEVERE, null, ex); 
      } finally { 
       out.close(); 
      } 
     } 

感謝您的幫助。

Safari,Opera和Chrome工作正常。沒有試過IE。

**** ****編輯

確定這整個時間,這是一個間距問題。我的文件名是「文件名.csv」,這可以在除firefox以外的所有瀏覽器中使用。不久,我把我的文件名「filename.csv沒有空格,它下載了它,我沒有注意到它下載時只是在空間前下載了名字的第一部分。祝你好運!

+3

你應該試試IE瀏覽器,看看你到達那裏的結果。也許這會告訴你更多關於你使用Firefox的問題。 – AudioDroid 2011-03-01 14:53:43

+0

請注意,只有當通過直接鏈接/調用或者使用'ServletContext#getMimeType()'從public webcontent提供資源時才使用''。在這個特定的目的中,你提供響應並自己設置Content-Type頭部是無關緊要的。 – BalusC 2011-03-01 15:10:39

+0

是的,我明白。我只是想盡一切辦法。這個特定的代碼適用於IE8。它認爲它是一個csv,我可以保存並打開它。我不知道Firefox有什麼問題。 – 2011-03-01 15:15:34

回答

4

好吧,這整個時間,這是一個間距問題。我的文件名是「文件名.csv」,這可以在除firefox以外的所有瀏覽器中使用。不久,我把我的文件名「filename.csv沒有空格它下載它找到我沒有注意到,當它下載它只是下載空間前的名稱的第一部分。

在未來確保文件名具有在頭周圍有一個單引號。這將允許,如果你需要一個空間的文件名Firefox的正確下載(不剝離任何過去的空間)。

祝你好運!

+1

任何人現在到這個問題現在:見http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download。真正的問題是你應該擁有Content-Disposition:附件;文件名=「帶空格的文件名」。 – 2013-09-16 19:13:27

+0

@NateBundy的評論是正確的。如果您的標頭位於雙引號字符串中,則您可以在文件名周圍使用雙引號。 – 2014-01-07 16:25:59

+0

感謝你的帖子,它幫助解決了一個問題與Firefox [這裏](http://stackoverflow.com/a/32373057/2218697)是解決方案 – stom 2015-09-03 10:29:29

1

添加內容類型標頭值文本/ CSV

response.setHeader("Content-type: text/x-csv"); 
+2

'text/csv'也應該足夠了。 – 2011-03-01 15:00:43

+0

不起作用。一樣。 Firefox將它視爲沒有擴展名的文件名。如果我將application/vnd.ms-excel作爲內容類型添加,即使其爲.csv文件,也會將其視爲excel(xlsx)文件。 – 2011-03-01 15:06:24

0

我不是在Java/JSP的專家,但你確定這是文本/ CSV是否正確?
response.setHeader(「內容轉移 - 編碼「,」二進制「);
您是否嘗試註釋掉它?在PHP中,我將簡單地回顯/打印CSV頭文件的內容類型頭文件和處置類型。

2

內容類型的文本/ CSV是正確的,但你也應該增加一個字符集編碼:

response.setHeader("Content-type: text/csv; charset=utf-8"); 

但到底是什麼:

response.setHeader("Content-Transfer-Encoding", "binary"); 
response.setHeader("Content-length", String.valueOf(stringList.size())); 

刪除頭!內容長度以字節爲單位。不要試圖自己計算它。在這個例子中,這是絕對錯誤的!主要類型爲text的Mime類型不是二進制的!

+0

仍然無法使用。 Firefox不斷剝離csv。 IE8在這種情況下工作。如果更改的內容類型來 .xls的應用/ EXCEL .xls的應用/ vnd.ms-Excel的 的.xls應用程序/ x-Excel的 的.xls應用程序/ x-msexcel的 它把XLS或XLSX上結束。 – 2011-03-01 15:21:07

+0

請[檢查此](http://stackoverflow.com/questions/39848019/why-php-script-does-not-generate-csv-file-in-firefox/39848402)需要幫助 – 2016-10-04 10:33:04

6

我在PHP中遇到了同樣的問題,發現在文件名中添加雙引號可以修復問題。

response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + \""); 
0

Response.AddHeader(「content-disposition」,string。格式(「attachment; filename = \」{0} \「」,fileName)); Response.ContentType =「text/csv; charset = utf-8」;