Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写消息并同时发送下载文件(getWriter、getOutputStream冲突)_Java_Servlets - Fatal编程技术网

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

Java 编写消息并同时发送下载文件(getWriter、getOutputStream冲突),java,servlets,Java,Servlets,我看到了这个链接 这个链接呢 我试过一些东西,但至今未能成功 我的多吉特方法 public void doGet(HttpServletRequest req, HttpServletResponse res){ this.doPost(req,res); } 我的doPost方法: public void doPost(HttpServletRequest req, HttpServletResponse res){ ServletOutputStream sos = respon

我看到了这个链接

这个链接呢

我试过一些东西,但至今未能成功

我的多吉特方法

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;

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

不可能吗


谢谢

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

我被“希望能够显示消息”-向web客户端显示消息,或在控制台上显示消息弄糊涂了?如果您还希望流式传输到控制台,当您调用
sos.write(bbuf,0,length)
时,也要立即调用
System.out.write(bbuf,0,length)
(例如)-并将输出到两个位置


另一方面,如果您试图同时向web客户端发送文件和消息,则这是不可能的。您首先需要向用户发送“消息”——可能是一个文本/html响应——其中包含一个指向servlet的链接,该servlet允许用户下载文件内容。(您将看到许多网站在HTML中使用JavaScript或meta refresh标记提示浏览器尝试自动下载,立即或很快提示用户基本上单击此下载链接。)

感谢回复,第二选择我想向客户端发送消息。如果我选择向用户显示下载文件的链接,我如何将字符串(下载文件内容)作为post参数传递?tuxi-不要。当他们在查看邮件后请求下载时检索或生成内容。