On Mon, Apr 07, 2008 at 07:32:48AM -0700, rosen jiang wrote: > > well, I have some idea: > > ByteArrayOutputStream baos = new ByteArrayOutputStream(); > ................ > ......... > ..... > . > add(new Link("download") { > public void onClick() { > WebResponse response = (WebResponse) getResponse(); > response.setHeader("Content-Disposition", > "attachment;filename=" + "aaa.xls"); > > response.setContentType("application/x-msdownload"); > response.getOutputStream().write(baos.toByteArray()); > baos.flush(); > baos.close(); > }}); > > It's work! very easy, like a Servlet, but above codes need some > try-catch-finally block. >
Hi Rosen, The problem with your code is that your BAOS is serialized with your page, which means that your entire report is using up space in your session, even if the user never clicks the link. Here's some code from my application that uses Wicket's AbstractResourceStreamWriter, which was mentioned on this list a few days ago: @Override public void onClick() { final ReportGenerator generator = getReportGenerator(); IResourceStream resourceStream = new AbstractResourceStreamWriter() { public void write(OutputStream output) { try { generator.generate(output, columns, dataProvider); } catch (IOException e) { throw new RuntimeException(e); } } public String getContentType() { return generator.getContentType(); } }; getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(resourceStream).setFileName(getFileName())); } ReportGenerator is my own abstraction for generating the report. Note that the bytes are generated only when the link is clicked, and they are streamed directly to the client without being stored in an intermediate byte array. Hope this helps. jk --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]