检票口下载输出流 [英] wicket download output stream

查看:97
本文介绍了检票口下载输出流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想下载csv文件,我将响应内容写入并写入,在我之后进行小门检阅,而我所获得的内容是应该是我的csv的html页面

I want to download csv file , i take the response content and write to it , apprently wicket write after me and the content iam getting is the page html where it should be my csv

我在示例中看到了throw new AbortException()的用法; 我使用的是6.7版,您知道我的检票口是否有东西呢? 或更确切地说,我做错了什么....

I have seen in the example the usage of throw new AbortException(); I am using version 6.7 , do you know if my version wicket has somthing instead of it ? or rather I am doing somthing wrong ....

能请你帮我...

 add(new Link<Void>("export") {
        @Override
        public void onClick() {

            WebResponse response = (WebResponse) getResponse();
            response.setAttachmentHeader("export.csv");
            response.setContentType("text/csv");

            OutputStream out = getResponse().getOutputStream();

            try {
                c.exportData(dataSource.getListForExport(), columns, out);

            } catch (Exception ex) {
                System.err.println(ex);
            }

        }

    });




   public <T> void exportData(List<T> list, List<IGridColumn<IDataSource<T>, T, String>> columns, OutputStream outputStream)
        throws IOException {
    long startTime = System.nanoTime();
    PrintWriter out = new PrintWriter(new OutputStreamWriter(outputStream, Charset.forName(characterSet)));
    try {
        if (isExportHeadersEnabled()) {
            boolean first = true;
            for (IGridColumn<IDataSource<T>, T, String> col : columns) {
                if (first) {
                    first = false;
                } else {
                    out.print(delimiter);
                    System.out.println(delimiter);
                }
                if (col.getId().equals("checkBox")) {
                    continue;
                }
                out.print(quoteValue(col.getId()));
                System.out.println(col.getId());
            }
            out.print("\r\n");
            System.out.println("\r\n");
        }
        Iterator<? extends T> rowIterator = list.iterator();
        while (rowIterator.hasNext()) {
            T row = rowIterator.next();

            boolean first = true;
            for (IGridColumn<IDataSource<T>, T, String> col : columns) {
                if (first) {
                    first = false;
                } else {
                    out.print(delimiter);
                    System.out.println(delimiter);
                }
                if (col.getId().equals("checkBox")) {
                    continue;
                }
                Object o = (new PropertyModel<>(row, col.getId())).getObject();// ((AbstractColumn<T,

                if (o != null) {
                    Class<?> c = o.getClass();
                    String s;
                    IConverter converter = Application.get().getConverterLocator().getConverter(c);

                    if (converter == null) {
                        s = o.toString();
                    } else {
                        s = converter.convertToString(o, Session.get().getLocale());
                    }

                    out.print(quoteValue(s));
                    System.out.println(quoteValue(s));
                }
            }
            out.print("\r\n");
            System.out.println("\r\n");
        }
    } catch (Exception ex) {
        System.out.println(ex);
    } finally {
        System.out.println(out);
        out.close();

        // measure
        System.out.print(System.nanoTime() - startTime);
    }
}

推荐答案

做到这一点的最佳方法是使用动态资源.我建议您阅读此免费Wicket指南的使用Wicket进行资源管理"一章: https ://code.google.com/p/wicket-guide/.

The best way to do this is using dynamic resources. I'll suggest you to read chapter "Resource managment with Wicket" of this magnific free Wicket guide: https://code.google.com/p/wicket-guide/.

这里有本指南自定义资源"部分中给出的类似示例.

Here you have a similar example given in this guide in the section "Custom resources".

public class RSSProducerResource extends AbstractResource {

@Override
protected ResourceResponse newResourceResponse(Attributes attributes) {
     ResourceResponse resourceResponse = new ResourceResponse();
     resourceResponse.setContentType("text/xml");
     resourceResponse.setTextEncoding("utf-8");
     resourceResponse.setWriteCallback(new WriteCallback()
     {
        @Override
        public void writeData(Attributes attributes) throws IOException
        {
             OutputStream outputStream = attributes.getResponse().getOutputStream();
             Writer writer = new OutputStreamWriter(outputStream);
             SyndFeedOutput output = new SyndFeedOutput();
             try {
                 output.output(getFeed(), writer);
             } catch (FeedException e) {
                 throw new WicketRuntimeException("Problems writing feed to                     response...");
             }
        }
     });
     return resourceResponse;
}

// method getFeed()...

}

然后您需要在所需的页面或组件中添加链接:

And then you need to add the link in the desired page or component:

add(new ResourceLink("rssLink", new RSSProducerResource()));

这篇关于检票口下载输出流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆