2014-11-03 83 views
6

我希望我的程序在文件開始下載之前彈出一個另存爲窗口選項,但是當我運行我的servlet時,它會自動開始下載文件。我在這裏錯過了什麼?在使用內容配置下載文件時遇到問題

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    ServletOutputStream outputStream = response.getOutputStream(); 
    FileInputStream fis=new FileInputStream("E:/sound.mp3"); 
    response.setContentLength(fis.available()); 
    response.setContentType("audio/basic"); 
    response.addHeader("content-disposition", "attachment;filename=abc.mp3"); 
    while(true){ 
     int read = fis.read(); 
     if(read==-1)break; 
     outputStream.write(read); 
    } 
    fis.close();   
} 
+0

我相信這是在服務器端。您正在嘗試將服務器事件傳播到客戶端。 – christopher 2014-11-03 17:39:49

+0

看看:http://stackoverflow.com/questions/3802510/force-to-open-save-as-popup-open-at-text-link-click-for-pdf-in-html和http: //safd.com/files/2226192/generate-some-xml-in-javascript-prompt-user-to-save-it問候 – 2014-11-03 18:11:24

+1

@DaniloMuñoz:作爲我可以看到avobe兩個場景是不同的形式mine..but感謝您的關注 – 2014-11-03 18:14:17

回答

6

您的程序不是桌面/獨立的,因爲它是在服務器上運行的servlet。當你在Eclipse中通過右擊並在run as - >run on server中運行它時,Eclipse實際上會打開一個網頁來顯示結果。因此,您的程序現在是一個Web應用程序,並且Eclipse(或其打開的頁面)是客戶端。客戶保存你發送的信息,而不是你的程序。得到它了?

content-disposition頭只有建議下載的文件名。瀏覽器設置定義它是否會打開另存爲窗口。你無法控制。

例如,在谷歌瀏覽器中,在Setting/Advanced Setting/Downloads中,有選項Ask where to save each file before downloading。只有選中此選項,它纔會打開您想要的對話框。否則,它會將其保存在默認位置(也在瀏覽器設置中定義)。所有瀏覽器都有類似的選項。

另外請注意,這取決於content-type頭,瀏覽器將嘗試顯示的內容,而不是下載它。例如,瀏覽器將嘗試顯示文本和HTML。但你可以下載由頭設置爲不可顯示的類型:

response.setContentType("application/octet-stream");

如果你不想創建一個Web應用程序:既然你的程序服務器上運行,它只是發送信息並完成。這是誰決定如何處理它的客戶端程序。在你現在的情況下,客戶端是瀏覽器(或者Eclipse打開瀏覽器頁面)。諸如content-disposition標頭的頭部針對瀏覽器。如果您要創建自己的客戶端(Swing客戶端,Android應用程序,iPhone應用程序)而不是瀏覽器,那麼客戶端將從服務器接收信息並決定如何處理它(顯示它或將其保存在任何方式),甚至忽略HTTP標頭。

+0

非常感謝。你解釋得很好。 – 2014-11-16 10:30:56

2

試看看這裏:http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofFiledialogboxes.htm

取出主語句在他們的代碼,並把run(new FileChooserTest(), 250, 110);在自己的代碼。如果我這樣做了,我會創建一個名爲saveStatus的int和3個等於0,1和2的決賽,分別命名爲waiting,savecancel。然後我會在你的其他程序中做一個while循環來查看saveStatus是否等於waiting來暫停程序(而不是對話框)。之後,我會做一個if語句來查看saveStatus是否等於save。如果是這樣,請下載,如果沒有,請不要。就那麼簡單。

2

你的問題是Mime類型。某些類型(特別是那些已知特定處理程序的類型)將直接由大多數瀏覽器下載。它確實有助於使用應用程序/二進制文件,但即使如此,一些瀏覽器也可能配置爲下載它或解釋處置處理程序中的文件擴展名。

我認爲大多數解決方案在下載鏈接之前在頁面上使用javascript。