从servlet下载文件客户端时出现意外的字符

时间:2012-02-23 16:05:11

标签: java gwt servlets character-encoding

我创建了一个servlet来下载一个特定的文本,客户端发布之前的文本(在textarea中)...客户端的表单没什么特别的:

    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č-`"

将这些字符写入我的文件时,我不知道......

1 个答案:

答案 0 :(得分:3)

ObjectOutputStream用于序列化"任意" Java对象转换为二进制数据格式,使用ObjectInputStream可以轻松地从另一个Java程序读取。听起来不像那样你只想输出一些文字。最简单的方法是:

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

如果您要编写更多的文本数据,则可以使用Writer:

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);

请注意,网络容器会自动关闭作者和流,因此您不必自己关闭。