Java 通过servlet将pdf流式传输到浏览器
我有一个典型的servlet,它将pdf流式传输到浏览器。PDF存储在一个内部服务器上,我的servlet从该服务器获取数据。如果我直接从浏览器点击servlet,就会显示pdf。如果我在Java 通过servlet将pdf流式传输到浏览器,java,pdf,servlets,stream,Java,Pdf,Servlets,Stream,我有一个典型的servlet,它将pdf流式传输到浏览器。PDF存储在一个内部服务器上,我的servlet从该服务器获取数据。如果我直接从浏览器点击servlet,就会显示pdf。如果我在 编辑-以下在FF中工作。我不知道它有多标准 public class PdfServlet extends HttpServlet { private static final Logger log = Logger.getLogger(PdfServlet.class.getName());
编辑-以下在FF中工作。我不知道它有多标准
public class PdfServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(PdfServlet.class.getName());
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) {
String url = (String) req.getParameter("url");
log.info("The URL is " + url);
String format = "application/pdf";
// String format = "image/gif";
streamBinaryData(url, format, res);
}
/*
* This Method Handles streaming Binary data
* <p>
* @param String urlstr ex: http;//localhost/test.pdf etc.
* @param String format ex: pdf or audio_wav or msdocuments etc.
* @param ServletOutputStream outstr
* @param HttpServletResponse resp
*/
private void streamBinaryData(
String urlstr,
String format,
HttpServletResponse resp) {
ServletOutputStream outstr = null;
String ErrorStr = null;
try {
outstr = resp.getOutputStream();
//find the right MIME type and set it as contenttype
resp.setContentType(format);
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
URL url = new URL(urlstr);
URLConnection urlc = url.openConnection();
int length = urlc.getContentLength();
resp.setContentLength(length);
// resp.setHeader("Content-Length", String.valueOf(+length));
// resp.setHeader("Content-Disposition", "inline");
// Use Buffered Stream for reading/writing.
InputStream in = urlc.getInputStream();
bis = new BufferedInputStream(in);
bos = new BufferedOutputStream(outstr);
byte[] buff = new byte[length];
int bytesRead;
// Simple read/write loop.
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
log.info("Got a chunk of " + bytesRead);
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
ErrorStr = "Error Streaming the Data";
outstr.print(ErrorStr);
} finally {
log.info("finally!!!");
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
if (outstr != null) {
outstr.flush();
outstr.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
中高音:
。看起来很受支持。您的浏览器甚至可以在
img
元素中显示PDF文件吗?那真的不太可能。我认为,当浏览器发现它实际上不是图像时,就会终止连接
有些浏览器并不抱怨内容类型。他们检查图像文件并找出图像本身的格式。这可以解释显示GIF图像的原因。您应该使用锚定标记(如果必须使用img,请将img的src指向真实图像,对img进行包裹)。锚点的href将是显示PDF的servelt。确保您在servlet中设置了正确的内容类型。问题是您试图显示带有
img
标记的PDF文档img
只能处理简单的图像格式,如JPEG、GIF或PNG
普通浏览器通常无法单独显示PDF内容。如果没有安装PDF查看器插件,则浏览器将仅显示保存对话框以下载PDF文件
因此,最安全的方法是HTML页面只包含指向PDF文件的链接。可以使用
target=“\u blank”
打开一个新的浏览器窗口。第一件事:您正在尝试立即读取长度。
这不是一个好的做法,因为它不能保证你的任务
试着通过
byte[]read\u buffer=新字节[1024*10]
这样,您可以一次读取10kb。
并在bos
上写入10kb
保持此循环,直到通过read
功能获得-1
是的。你不应该在pdf中使用img标签我从来没有想过。在发布中使用可能的解决方案进行编辑。功能要求是什么?是否以内联方式显示PDF?无论是
还是
都是这方面的正常方法。现在我认为需要一些东西来工作,哈哈。带有PDF的服务器在我们的防火墙后面。测试时,测试人员显然仍然在VPN上,或者有一个缓存页面。我们不知道。但我们的客户都看不到他们的PDF文件,而且。。。紧张的我们在星期六努力工作。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cheesy Servlet Experiment</title>
</head>
<body>
<h1>Cheesy Servlet Experiment</h1>
<P>
<img src="http://10.0.0.9/ServletExperiment/pdf?url=http%3a%2f%2fwww.samplepdf.com%2fsample.pdf" alt="yah mon">
<P>
<img src="http://10.0.0.9/ServletExperiment/pdf?url=http%3a%2f%2fbbs.homeshopmachinist.net%2fimages%2fstatusicon%2fforum_new.gif" alt="yah mon">
</body>
</html>
<object data="http://www.samplepdf.com/sample.pdf" type="application/pdf" width="600" height="600">
alt : <a href="http://www.samplepdf.com/sample.pdf">test.pdf</a>
</object>