使用 Struts2 你有Action
s 和Result
s。
所以,你需要一个Action
映射到你的链接,让我们称之为download_file.do
你创建你的链接列表,传入一个参数来告诉struts2下载哪个文件(允许任意文件是危险的,所以文件名可能会很好)。
<s:iterator value="fileList">
<s:a action="download_file">
<s:property value="fileName"/>
<s:text name="my.link"/>
</a>
</s:iterator>
现在,Action
您需要fileName
照常设置。
在execute
方法中获得文件名后,打开一个并InputStream
为其File
提供一个getter
。您可能还想获取文件的大小和要下载的名称。
让我们假设InputStream
isgetFileToDownload
的 getter , size 的 getter 是getFileSize
。
您需要为内容配置提供一个 getter,这将设置下载文件的名称,例如:
public String getContentDisposition() {
return "attachment;filename=\"" + fileName + "\"";
}
还有一个 MIME 类型的吸气剂,比如
public String getContentType() {
return "text/plain";
}
显然将 MIME 设置为正确的类型。
所以你的基本Action
看起来像这样
public class MyAction extends ActionSupport {
private final File baseDownloadDir = new File("somewhere");
private String fileName;
private InputStream inputStream;
private long fileSize;
@Override
public String execute() throws Exception {
/*
*This is a security hole begging to be exploited.
*A user can submit "../../../../someImportantFile"
*and potentially download arbitrary files from the server.
*You really need to do some validation on the input!
*/
final File fileToDownload = new File(baseDownloadDir, fileName);
fileSize = fileToDownload.length();
inputStream = new FileInputStream(fileToDownload);
return "downloadFile";
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getFileSize() {
return fileSize;
}
public InputStream getFileToDownload() {
return inputStream;
}
public String getContentDisposition() {
return "attachment;filename=\"" + fileName + "\"";
}
public String getContentType() {
return "text/plain";
}
}
然后您返回一个结果名称,让我们调用它downloadFile
。
在您的动作映射中,您需要将该结果映射到 a StreamResult
,这是一个 XML 示例
<result name="downloadFile" type="stream">
<param name="inputName">fileToDownload</param>
<param name="contentType">${contentType}</param>
<param name="contentLength">${fileSize}</param>
<param name="contentDisposition">${contentDisposition}</param>
<param name="contentCharSet">UTF-8</param>
<param name="allowCaching">true</param>
</result>
您可能想要更改字符集。