2013-04-28 45 views
0

我的問題是,我有一個計劃,確實讓文件&流出來給用戶&我有兩個問題:Spring MVC中的OutputStream

1)首先如何更改文件名&類型(X。 sql)

2)如果在創建文件時出現異常,該怎麼辦&我想將用戶重定向到錯誤頁面,因爲我們的方法的返回類型在我們想要寫入servlet中的outputstream時是無效的!

我的計劃是這樣的:

@RequestMapping(value = "/test/{jobid}") 
    public void dumpData(@PathVariable("jobid") long jobid, HttpServletResponse response) { 
    try { 

     response.setContentType("application/octet-stream"); 
     ServletOutputStream out = response.getOutputStream(); 
     String downloadOutput = ""; 
     // AM I ABLE TO SET FILENAME SO THE USER DOWNLOAD THE FILE WITH THAT NAME ? 
     // DOES SETHEADER HELP ME IN THIS CASE ? 

     ... (making downloadOutput String by values coming from somewhere) 

     out.write(downloadOutput.getBytes("UTF-8")); 
     out.flush(); 
     out.close(); 
    } catch(SomeException e){ 
     //WHEN THE RETURN TYPE IS VOID HOW TO REDIRECT USER TO ERROR PAGE IN CASE OF SOME PROBLEM ? 
     //(INFO:)IF WE DEFINE STRING AS RETURN TYPE THE PROGRAM WILL GET EXCEPTION 
    } 
+0

一旦開始將文件的內容寫入響應,您將無法重定向到錯誤頁面。如果在此之前發生錯誤,您可以執行'response.sendRedirect(url)' – 2013-04-28 15:55:12

回答

2

回答你的第一個問題:

response.setHeader("Content-Disposition", "attachment;filename=" + filename); 
//for zip file 
response.setContentType("application/zip"); 

Here是MIME類型,各種內容類型的列表。

我找到了解決方案here。您可以將返回類型更改爲字符串,並在錯誤發生時返回錯誤視圖名稱,否則返回null。我從鏈接中瞭解到,返回null和返回類型void類似。

+0

下載類型爲sql並且沒有從文件中讀取數據,這將通過從某處接收數據來創建。我的第二個問題呢? (我編輯了我的問題!) – Mehdi 2013-04-28 05:40:58

+0

內容類型被瀏覽器用來選擇默認程序來顯示文件。由於你的文件是.sql,我相信你期望用戶保存它或者在文本編輯器中打開,所以「application/octet-stream」或「text/plain」應該可以工作。 對不起,我不是春季MVC的專家,但仍然爲你找到解決方案。我會盡快回復。 – 2013-04-28 05:56:34

+0

更新了我的答案。你可以檢查這是否有效? – 2013-04-28 06:25:17

1

什麼阻止你使用response.sendRedirect(errorPage)?

+0

因爲這個問題是關於流數據2用戶,所以當他/她點擊下載鏈接時,我們不需要2重定向用戶,他們有2留@在同一頁面,但是如果數據流時出現異常例如堆溢出等,所以我們需要將用戶重定向到另一個頁面,比如錯誤頁面,因爲我們的用戶必須知道系統內部發生了什麼,所以我想出了一個辦法,而不是讓方法失效,我們可以讓它在這種情況下字符串&返回null,以便對於catch例外,我們可以簡單地重定向到另一個頁面,一切都是好的! – Mehdi 2013-04-30 11:13:39