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

3

我有一个棘手的问题。

我将一个pdf文件保存在WEB-INF/folder/test.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路由是正确的,但在单击时不起作用,返回空值。

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

还尝试了在那个类中的execute()中使用InputStream,该类继承了ActionSupport并实现了SessionAware

有人能帮忙解释一下我必须做什么吗?


5
你知道WEB-INF文件夹中的文件在URL上是不可见的,所以你需要在操作中打开该文件并将其流式传输给客户端。 - Aleksandr M
2个回答

2
客户端 "知道" 服务器端的实际路径并不相关。因此,如果你告诉客户端实际路径,这是没有帮助的。 不要这样做:<a href="<%=pathDownload%>/test.pdf" >,只需这样:<a href="download.action?file=folder/test.pdf" >。 为了使这个例子工作,你必须将 download url action 映射到一个具有流结果类型的 action 中:
<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;
    }
}

太准确了!!!它起作用了!!我不知道我需要另一个映射Java,非常感谢!! - DeathGun

0
你需要将文件的路径传递给操作类的动作方法,就像这样。
<s:a href="download.action?file=%{pathDownload}/test.pdf">Download</s:a>

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

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

如果您正在使用约定配置,可以在此处找到类似的实现。


太好了!如果您不知道如何操作,请阅读这里,并接受答案。 - Roman C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接