Java servlet不写响应字节

时间:2016-10-20 12:19:55

标签: java tomcat servlets

我运行了一些生成并返回PDF文档的Java servlet(3.x - Tomcat 8)。我从来没有遇到任何问题。我最近编写了一个新的servlet来创建和返回一个PDF文档,这个新的servlet正在使用完全相同的响应代码,正如其他人使用的那样:

response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition","attachment; filename=\""+filename+".pdf\""); 
response.setContentLength(pdfBytes.length);

System.out.println("# Bytes => " + pdfBytes.length);

ServletOutputStream sos = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(sos);
bos.write(pdfBytes);
sos.flush();
sos.close();

正如我所说,这对其他人一直很好,但是当我调用新的servlet时,它会返回0个字节,即使上面的print语句具有非零值。

但是,如果我将上面的响应编写代码更改为:

OutputStream os = response.getOutputStream();
os.write(pdfBytes);
os.flush();
os.close();

...它工作正常,返回格式正确的PDF文档。为什么会发生这种情况?

2 个答案:

答案 0 :(得分:3)

你没有冲洗let myTFrame = CGRectMake(0, 0, DC.screenWidth/2-53, 30) myT = UITextField(frame: myTFrame) myT.delegate = self myT.textAlignment = .Right myT.text = "תת קטגוריה" myT.textColor = .grayColor() myT.delegate = self myT.inputView = tempView view.addSubview(myT) - 所以它会缓冲你的所有数据。您应该清除那个,而不是if(isset($_POST["send"])) { $email = test_input($_POST['email']); if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { $query = 'INSERT INTO subscriber (data, ip, email) (SELECT CURRENT_TIMESTAMP, "'.$_SERVER['REMOTE_ADDR'].'", "'.$email.'" FROM dual where NOT EXISTS ( Select count(email) as c FROM ( SELECT email FROM subscriber WHERE ip="'.$_SERVER['REMOTE_ADDR'].'" and DATE(`data`) = CURDATE() group by email) as a having c>5))'; $result = mysqli_query($dbc, $query) or die(mysqli_error($dbc)); $msg="E-mail sent successfully"; } else { $msg="Wrong e-mail address"; }

但是,如果你只是编写一个单字节数组,那么无论如何都使用BufferedOutputStream是没有意义的 - 你也不需要显式刷新,因为关闭会刷新。所以你只需要:

ServletOutputStream

我个人期望 servlet容器关闭输出流,但是文档中并不清楚。如果发生异常,是否要关闭它是另一回事......

答案 1 :(得分:1)

你应该真正刷新并关闭bos而不是sos