2012-02-23 50 views
1

我創建了一個servlet來下載客戶端發佈的特定文本(之前在textarea中)...客戶端中的表單沒有任何特定規則:從servlet下載文件客戶端時出現意外字符

form = new FormPanel(); 
    form.setMethod(FormPanel.METHOD_POST); 
    form.setAction(GWT.getModuleBaseURL() + "services/export"); 
    exportButton = new Button(resource.SUBMENU_Export(), new ClickHandler() { 

     public void onClick(ClickEvent event) { 
      form.submit(); 
     } 
    }); 

這是在服務器端的代碼(的serlvet):

package com.server.servlet; 

    import java.io.IOException; 
    import java.io.ObjectOutputStream; 
    import java.io.OutputStream; 
    import javax.servlet.Servlet; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    public class ExportServlet extends HttpServlet implements Servlet { 

     private static final long serialVersionUID = 7526472295622776147L; 

     @Override 
     protected void doPost(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { 
      String expl = req.getParameter("Expl"); 
      response.setContentType("application/octet-stream"); 
      response.setHeader("Content-Disposition", "attachment; filename=hint.txt;"); 
      OutputStream stream = response.getOutputStream(); 
      ObjectOutputStream objectStream = new ObjectOutputStream(stream); 
      objectStream.writeObject(expl); 
      objectStream.flush(); 
     } 
    } 

但是當我打開下載的文件,也有意想不到的字符只有在文件中開頭:

"`¬í tč-`" 

我不知道,當寫這些文字我的文件...

+0

您應該將內容類型設置爲「text/plain」。這不是二進制數據,這只是純文本數據。 – BalusC 2012-02-23 17:58:49

+0

當您可以與服務器與RPC(或requestbuilder)進行通信時,爲什麼會遇到所有這些麻煩,servlet端的remoteservlet會爲您讀取文件並將文本發送到客戶端回調。 – 2012-02-27 02:56:37

回答

3

ObjectOutputStream用於序列化「任意」 Java對象轉換成二進制數據格式,便於使用ObjectInputStream另一個Java程序來讀取。聽起來好像不是你只想輸出一些文字。它最簡單的方法是這樣的:

OutputStream stream = response.getOutputStream(); 
stream.write(expl.getBytes("UTF-8")); 

如果你有文本數據的一個更大的量來寫,你可以使用,而不是一個作家:

OutputStream stream = response.getOutputStream(); 
OutputStreamWriter writer = new OutputStreamWriter(stream, "UTF-8"); 
writer.write(expl); 
writer.flush(); // flush text data from writer to stream 

輸出流是用於發送任意的二進制數據,這可能是也可能不是你想要的。在上面的流保持打開,所以你可以在文本後添加更多的數據。如果你的所有輸出文本,你不妨設置內容類型text/plain和使用response的作家,而不是:

response.setCharacterEncoding("UTF-8"); 
PrintWriter writer = response.getWriter(); 
writer.write(expl); 

注意,作家和流通過Web容器,這樣你就不會自動關閉必須自己做。

+0

完美答案,謝謝! – czupe 2012-02-23 16:21:21

+0

「更大數據量」的說法沒有意義。輸出流用於二進制數據,寫入器用於字符數據。就這樣。其中一個並不比另一個更耗費內存。後者最好是'response.getWriter()。write(expl)'',你可以通過response.setCharacterEncoding(「UTF-8」)事先設置字符編碼。沖洗和關閉也是不必要的,因爲容器已經做到了。 – BalusC 2012-02-23 17:57:34

+0

謝謝。 「更大的數據量」參數是當你想發出更多的數據而不是「爆炸」的內容,並且不希望把它全部保存在內存中時。 – Joni 2012-02-24 11:07:40

相關問題