Java Struts2 - 在JSP中的WEB-INF文件夹中访问.pdf文件

时间:2016-02-09 10:46:28

标签: java struts2

我有一个复杂的问题。

我在WEB-INF/folder/test.pdf下保存了一个pdf文件 但是现在,我希望能够在JSP文件中下载该pdf文件。我知道WEB-INF中的文件不能通过URL看到,但是我已经尝试了这个页面中可能的所有答案,但都没有。

String pathDownload = ((ServletContext) ActionContext.getContext().get(StrutsStatics.SERVLET_CONTEXT)).getRealPath("/WEB-INF/folder/")+ "\\";

在我的JSP文件中,我得到了:

<a href="<%=pathDownload%>/test.pdf" >

因此,URL路由是正确的,但在单击时不会执行任何操作,返回null。

我尝试在文件web.xml中写一些内容,但没有任何作用。

还在该类的InputStream中尝试了execute() 扩展ActionSupport实施SessionAware

任何人都可以帮忙解释我该怎么办?

2 个答案:

答案 0 :(得分:2)

客户端“知道”服务器端的实际路径并不重要。因此,如果您“告诉”客户端实际路径,那将无济于事。 代替: <a href="<%=pathDownload%>/test.pdf" >,只需<a href="download.action?file=folder/test.pdf" >。 要使此示例生效,您必须使用具有流结果类型的操作映射download url操作:

<action name="download">
    <result name="success" type="stream">
        <param name="contentType">application/pdf</param>
        <param name="inputName">fileStream</param>
        <param name="contentDisposition">attachment;filename="document.pdf"</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

DownloadAction.java中,您只需阅读file参数提及的文件,并使用文件内容创建名为fileStream的属性:

public class DownloadAction extends ActionSupport{

    private InputStream fileStream;
    private String file;

    public InputStream getFileStream() {
        return fileStream;
    }

    public void setFile(String file) {
        this.file = file;
    }

    public String execute() throws Exception {
        fileInputStream = new FileInputStream(
            new File(
                ((ServletContext) ActionContext.getContext().get(StrutsStatics.SERVLET_CONTEXT))
                .getRealPath("/WEB-INF/folder/")
                +
                file
            )
        );
        return SUCCESS;
    }
}

答案 1 :(得分:0)

您需要将文件的路径传递给动作类的动作方法,如此

<s:a href="download.action?file=%{pathDownload}/test.pdf">Download</s:a>

将使用file类型的属性String填充参数值。

然后使用inputStream属性初始化为getResourceAsStream()并返回stream类型结果,为inputStream属性提供getter。

如果您使用的是约定配置,则可以找到类似的实现here