Tapestry中的文件下载链接

时间:2015-04-08 16:20:02

标签: java tapestry

我有.tml文件及其控制器。控制器中有一个File变量,表示来自我服务器的现有文件。我希望用户可以下载此文件,例如<a href="link-to-file">Download this file</a>。我怎么能在挂毯上做到这一点?

我想要这样的事情:

//tml:
<t:file source="file">Download here</t:file>

//controller:
private File getFile() { ... }

1 个答案:

答案 0 :(得分:1)

这是一个可以为您实现此目的的简化示例。

你的tml中的

<a t:id="downloadLink">download</a>
你的java文件中的

private File getFile() { ... }

@Component(id="downloadLink")
private ActionLink downloadLink;

@OnEvent(component="downloadLink")
private Object handleDownload(){
    final File getFile();
    final OutputStreamResponse response = new OutputStreamResponse() {

        public String getContentType() {
            return "application/pdf"; // or whatever content type your file is
        }

        public void prepareResponse(Response response) {
            response.setHeader ("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
        }

        @Override
        public void writeToStream(OutputStream out) throws IOException {
            try {
                InputStream in = new FileInputStream(file);
                IOUtils.copy(in,out);
                in.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }                   
        }
    };
    return response;
}