编写消息并同时发送下载文件(getWriter,getOutputStream冲突)

时间:2011-12-02 14:58:57

标签: java servlets

我看到了这个链接

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;

}

如您所见,我想让用户端下载文件, 我也希望能够显示一条消息,

不可能吗?

由于

1 个答案:

答案 0 :(得分:0)

这当然是可能的。但是,您可能要做的第一件事就是重新设计它,这样您就不会通过String传递整个有效负载 - 尤其是如果您的数据类型实际上是一个八位字节流,而String将无法可靠地保存。

我对“希望能够显示消息”感到困惑 - 向Web客户端显示消息,或在控制台上显示消息?如果您还想要流式传输到控制台,当您拨打sos.write(bbuf, 0, length)时,也可以立即拨打System.out.write(bbuf, 0, length)(例如) - 然后您将输出到这两个位置。

另一方面,如果您尝试同时向Web客户端发送文件和消息,则无法进行此操作。您首先需要向用户发送“消息” - 可能是文本/ html响应 - 包含一个返回到servlet的链接,允许用户下载文件内容。 (您将看到许多网站在HTML中使用JavaScript或元刷新标记来提示浏览器尝试自动下载,立即或不久提示用户基本上单击此下载链接。)