我运行了一些生成并返回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文档。为什么会发生这种情况?
答案 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