我有一个复杂的问题。
我在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
任何人都可以帮忙解释我该怎么办?
答案 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。