我正在使用reportService类生成包含我的报告的JasperPrint对象,然后将其发送到Servlet并生成PDF。问题是这个servlet没有在新标签中打开PDF(这就是我想要的),实际上它甚至没有提示我下载它或任何东西。
Servlet来电者:
try {
URL url = new URL("http://" + serverName + ":" + serverPort + path
+ "/reportgenerator");
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setDefaultUseCaches(false);
connection.setRequestProperty("Content-Type",
"application/octet-stream");
ObjectOutputStream out = new ObjectOutputStream(
connection.getOutputStream());
//This "jasperPrint" is my generated report from my service
out.writeObject(jasperPrint);
out.close();
connection.getInputStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我的Servlet中的doPost方法:
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
JasperPrint jasperPrint = null;
ObjectInputStream resultStream = null;
ServletOutputStream out = response.getOutputStream();
try {
resultStream = new ObjectInputStream(request.getInputStream());
jasperPrint = (JasperPrint) resultStream.readObject();
resultStream.close();
byte[] rel = JasperExportManager.exportReportToPdf(jasperPrint);
out.write(rel,0, rel.length);
//JasperExportManager.exportReportToPdfStream(jasperPrint, out);
response.setContentLength(rel.length);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition",
"attachment; filename=\"report.pdf\"");
response.setHeader("Cache-Control", "no-cache");
System.err.println(rel.length);
} catch (JRException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
out.flush();
out.close();
}
}
我做错了什么?
答案 0 :(得分:1)
我已经解决了我的问题,将JasperPrint作为byte []返回到我的flex应用程序,在flex中它将被视为ByteArray(因为它被转换为,在我的情况下是granits)然后我只是调用我的servlet发送这个ByteArray。
我正在寻找另一种解决方案,但它可以帮助其他人。
答案 1 :(得分:1)
假设您要在应用程序的flex端打开文件的byte [],您应该能够将文件写入临时位置然后打开它。它看起来与此类似:
//create a temp dir in the system temp directory to place all the temp files for you app.
private static var tempDir:File=File.createTempDirectory();
/**
* bytes - the byte array of the pdf you want to open
* filename - the name to use for the temp file, you may need to create some type of
* counter to add to the beginning of the filename so that you always get
* a unique name
*/
public static openFile(bytes:ByteArray,filename:String):void{
//create a file in the system temp directory to write the file to
var tempFile:File = tempDir.resolvePath(filename);
//create a filestream to write the byte array to the file
var fileStream:FileStream = new FileStream();
fileStream.open(tempFile, FileMode.WRITE);
fileStream.writeBytes(bytes,0,bytes.length);
fileStream.close();
//open the temp file with default application
tempFile.openWithDefaultApplication();
}