2016-02-09 51 views
2

我有一个复杂的问题。Java Struts2 - 在JSP的WEB-INF文件夹中访问.pdf文件

我在WEB-INF/folder/test.pdf下保存了一个pdf文件 但是现在我希望能够将该pdf文件下载到JSP文件中。我知道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中写点东西,但没有任何效果。

在该类谁扩展ActionSupport工具SessionAware

任何人都可以解释帮我必须做什么的​​也试过InputStream

+5

*您知道,在WEB-INF文件是不可见的URL *,所以你需要在行动中打开此文件,并将其流式传输到客户端。 –

回答

0

您需要的文件的路径传递到你的动作类的操作方法是这样

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

String类型的物业file将被用来填充参数值。

然后用于将inputStream属性初始化为getResourceAsStream(),并返回stream类型的结果,为inputStream属性提供吸气剂。

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

+0

太棒了!请接受答案,如果您不知道如何阅读[this](http://stackoverflow.com/tour)。 –

1

客户端“知道”服务器端的实际路径并不相关。所以,如果你“告诉”客户端有关实际路径,它将无济于事。 而不是: <a href="<%=pathDownload%>/test.pdf" >,只是做<a href="download.action?file=folder/test.pdf" >。 为了使这个示例工作,你必须映射与动作有流结果类型download URL操作:,你刚才读出由file参数中提到的文件

<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和创建一个与该文件内容叫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; 
    } 
} 
+0

确切地!!!有效!!我不知道我需要另一个映射Java,非常感谢! – DeathGun

+0

您能否将答案标记为已接受? –

+0

@DeathGun Ping! –

相关问题