use*_*189 7 java pdf jsp servlets mime-types
我的应用程序中有pdf文件.我需要在浏览器中显示pdf.我正在将文件作为fileInputStream读取,我需要在我的应用程序中在浏览器中显示pdf.但我没有pdf路径,我有文件流.
请给我一些建议和例子
我使用ajax来显示pdf,我使用call_method()javascript ajax请求方法来调用showPdf动作,在showpdf动作中只是将pdf文件转换为ByteArrayOutputStream并将结果写入输出流.但它显示了以下提到的结果.
JSP中的结果:
%PDF-1.4% 1endstream endobj 4 0 obj <>>>/MediaBox [0 0 595 842] >> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj xref 0 7 0000000000 65535 f 0000000389 00000 n 0000000015 00000 n 0000000477 00000 n 0000000232 00000 n 0000000540 00000 n 0000000585 00000 n trailer << 142354f5ebefd65d6aacd33a7cb2b4ab>]/Info 6 0 R/Size 7 >> startxref 707 %% EOF
请给出一些建议.
Javascript ajax:
call_method(); <br/>
function call_method(){
Ext.Ajax.request({
waitMsg: 'Saving changes...',
url:'test.action?method=showPdf',
params : { },
failure:function(response,options){
},
success:function(response,options){
$("#pdf_content").show();
$("#pdf_content").html(response.responseText);
$("#pdf_content").show('slow');
}
});
}
Run Code Online (Sandbox Code Playgroud)
Java方法:
public String showPdf() throws IOException {
getResponse().setContentType("application/pdf");
getResponse().setHeader("Content-disposition","inline; filename=automatic_start.pdf" );
ByteArrayOutputStream baos = getByteArrayOutputStream();
getResponse().setContentLength(baos.size());
ServletOutputStream sos;
sos = getResponse().getOutputStream();
baos.writeTo(sos);
sos.flush();
return null;
}
private ByteArrayOutputStream getByteArrayOutputStream() throws IOException {
String filePath = "/homefolder/";
String folderPath=filePath+"1122/automatic_start.pdf";
File file = new File(folderPath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[256];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum); //no doubt here is 0
//Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
System.out.println("read " + readNum + " bytes,");
}
} catch (IOException ex) {
ex.printStackTrace();
}
return bos;
}
Run Code Online (Sandbox Code Playgroud)
您必须按如下方式写下您InputStream的回复OutputStream:
Content-Disposition意志必须如此inline.Content-Type意志必须如此application/pdf.Content-Length将是总数据的长度(以字节为单位)InputStream.设置后,将输入流数据写入响应的输出流.
这种效果的东西:
/* (non-Javadoc)
* @see org.bfs.bayweb.util.renderer.ServletViewRenderer#render(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void render(ServletRequest request, ServletResponse response) throws IOException {
// TODO Auto-generated method stub
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int inputStreamLength = 0;
int length = 0;
while ((length = getInputStream().read(buffer)) > 0) {
inputStreamLength += length;
baos.write(buffer, 0, length);
}
if (inputStreamLength > getContentLength()) {
setContentLength(inputStreamLength);
}
if (response instanceof HttpServletResponse) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.reset();
httpResponse.setHeader("Content-Type", getContentType());
httpResponse.setHeader("Content-Length", String.valueOf(getContentLength()));
httpResponse.setHeader("Content-Disposition", "\"" + getContentDisposition() + "\"" + ((getFileName() != null && !getFileName().isEmpty()) ? "; filename=\"" + getFileName() + "\"": ""));
}
response.getOutputStream().write(baos.toByteArray(), 0, (int)getContentLength());
//finally
response.getOutputStream().flush();
//clear
baos = null;
} finally {
// TODO Auto-generated catch block
close(response.getOutputStream());
close(getInputStream());
}
}
private void close(Closeable resource) throws IOException {
if (resource != null) {
resource.close();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43178 次 |
| 最近记录: |