我看到了这个链接
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 :(得分:0)
这当然是可能的。但是,您可能要做的第一件事就是重新设计它,这样您就不会通过String传递整个有效负载 - 尤其是如果您的数据类型实际上是一个八位字节流,而String将无法可靠地保存。
我对“希望能够显示消息”感到困惑 - 向Web客户端显示消息,或在控制台上显示消息?如果您还想要流式传输到控制台,当您拨打sos.write(bbuf, 0, length)
时,也可以立即拨打System.out.write(bbuf, 0, length)
(例如) - 然后您将输出到这两个位置。
另一方面,如果您尝试同时向Web客户端发送文件和消息,则无法进行此操作。您首先需要向用户发送“消息” - 可能是文本/ html响应 - 包含一个返回到servlet的链接,允许用户下载文件内容。 (您将看到许多网站在HTML中使用JavaScript或元刷新标记来提示浏览器尝试自动下载,立即或不久提示用户基本上单击此下载链接。)