0

在普通的 HTML 标记中,可以使用锚标记生成下载链接,例如:

<a href="www.example.com/somefile.zip">DOWNLOAD</a>

在 struts2 中,我将文件名和文件 URL 存储在数据库中。然后,在 JSP 文件中,填充下载链接,如:

<s:iterator value="fileList">
<a href='<s:property value="fileURL"/>'> <s:property value="fileName"/> </a>
</s:iterator>

通过这种方式,文件名及其链接被填充。当我将鼠标悬停在链接上时,我可以在浏览器的状态栏中看到正确的文件 URL。但是当我单击链接时,现在会显示下载对话框。我搜索了互联网,他们告诉使用 FileInputStream。我的问题是,是否可以像上面的代码那样生成下载链接而不是使用 FileInputStream?

4

1 回答 1

3

使用 Struts2 你有Actions 和Results。

所以,你需要一个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。您可能还想获取文件的大小和要下载的名称。

让我们假设InputStreamisgetFileToDownload的 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>

您可能想要更改字符集。

于 2013-04-12T15:25:05.750 回答