用Struts2框架做下载时,一直报异常
java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [inputStream]
action配置如下:
<action name="downFileAction" class="edu.fileManager.Action.DownFileAction">
<result name="success" type="stream">
<param name="contentType">
application/octet-stream;charset=ISO8859-1
</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">
attachment;filename="${downloadFileName}"
</param>
<param name="bufferSize">40960</param>
</result>
</action>
经查原因在于action的java文件中的getInputStream()方法不能正确返回InputStream流,ServletActionContext.getServletContext().getResourceAsStream(String path)获取到的返回为null,文件名path存在问题。
ServletContext. getResourceAsStream(String path):默认从当前的WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓。
public InputStream getInputStream() throws FileNotFoundException{
DB mysql = new DB();
String filename = mysql.returnFile(request, "fileName");
return ServletActionContext.getServletContext().getResourceAsStream("save/"+filename);
}
将path更改为("/save/"+filename)或("save/"+filename)后问题解决。
还可以直接使用FileInputStream(String path)方法获取InputStream,此处的path必须是绝对路径。
public InputStream getInputStream() throws FileNotFoundException{
DB mysql = new DB();
String realpath = mysql.returnFile(request, "filePath");
InputStream in = new FileInputStream(realpath);
return in;
}
此处的realpath为绝对路径。
文件目录结构如下图