2011-12-02 78 views
0

我看到這個鏈接寫消息,並在同一時間發送一個下載文件(的getWriter,的getOutputStream衝突)

How do I use getOutputStream() and getWriter() in the same servlet request?

而這個鏈接

best practice response.getOutputStream

我已經試過的東西但到目前爲止還不能成功。

我doGet方法

public void doGet(HttpServletRequest req, HttpServletResponse res){ 
this.doPost(req,res); 
} 

我doPost方法:

public void doPost(HttpServletRequest req, HttpServletResponse res){ 
    ServletOutputStream sos = response.getOutputStream(); 
    PrintWriter out = new PrintWriter(new OutputStreamWriter(sos, "utf-8")); 


if(something happens){ 
out.println(string_specific_to_situation); 
return; 
} 
else if(some other thing happens){ 

foo(sos,other_string_specific_to_situation); 
out.println(blabla); 
return; 
} 
else if(some thing else happens){ 

foo(sos,else_string); 
out.println(dotdot); 
return; 
} 


} 

一個Foo方法

public void foo(ServletOutputStream sos,String str){ 

int     length = 0; 
    InputStream is =null; 
    is= new ByteArrayInputStream(str.getBytes("UTF-8")); 


    // 
    // Set the response and go! 
    // 
    // 
    response.setContentType("application/octet-stream"); 
    response.setContentLength((int)str.length()); 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + name + "\""); 

    // 
    // Stream to the requester. 
    // 
    byte[] bbuf = new byte[20]; 
    DataInputStream in = new DataInputStream(is); 

    while ((in != null) && ((length = in.read(bbuf)) != -1)) 
    { 
     sos.write(bbuf,0,length); 
    } 

    in.close(); 
    sos.flush(); 
    sos.close(); 
    return; 

} 

正如你所看到的,我要讓用戶端下載文件, 也我想能夠顯示一條消息,

難道不可能嗎?

謝謝

回答

0

這當然是可能的。然而,你可能想要做的第一件事是重新設計它,這樣你就不會通過一個字符串傳遞你的整個有效載荷 - 尤其是如果你的數據類型實際上是一個字符串不能可靠地保存的八位字節流。

我很困惑「希望能夠顯示消息」 - 向Web客戶端顯示消息,或在控制檯上顯示消息?如果您還希望流式傳輸到控制檯,則當您撥打sos.write(bbuf, 0, length)時,還會立即呼叫System.out.write(bbuf, 0, length)(例如) - 並且您將輸出到兩個位置。

另一方面,如果您嘗試同時向Web客戶端發送文件和消息,這是不可能的。您首先需要向用戶發送「消息」 - 可能是一個text/html響應 - 包含一個鏈接回到servlet,允許用戶下載文件內容。 (你會看到許多網站在HTML中使用JavaScript或元刷新標籤來提示瀏覽器嘗試自動下載,立即或短時間提示用戶本質上點擊此下載鏈接。)

+0

感謝您的回覆,第二選擇我想發送消息給客戶端。如果我選擇顯示用戶下載文件的鏈接,如何將字符串(下載文件內容)作爲發佈參數傳遞給我? – merveotesi

+0

tuxi - 不要。取而代之,當他們在查看消息後請求下載時,檢索或生成內容。 – ziesemer

相關問題