Tapestry 中的文件下载 link
File download link in 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() { ... }
这是一个可能会为您实现此目的的简化示例。
在你的 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;
}
我有 .tml 文件及其控制器。控制器中有一个 File
变量,代表我服务器中的现有文件。我想让用户可以下载这个文件,比如 <a href="link-to-file">Download this file</a>
。我怎么能在挂毯中做到这一点?
我想要这样的东西:
//tml:
<t:file source="file">Download here</t:file>
//controller:
private File getFile() { ... }
这是一个可能会为您实现此目的的简化示例。
在你的 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;
}