• 程序错误

学习struts框架时,关于文件下载部分,利用struts中的stream结果类型来实现,配置完成之后,运行程序,报错如下:

HTTP Status 500 - Can not find a java.io.InputStream with the name [downFile] in the invocation stack. Check the <param name="inputName"> tag specified for this action.

  • 错误分析:

1、struts.xml配置文件中关于action部分的配置不对

<action name="downloadfile" class="com.shengsiyuan.struts2.DownloadAction">
    <result name="success" type="stream"> 
    <param name="contentDisposition">p_w_upload;filename="BeginLinuxProgramming.pdf"</param>
    <param name="inputName">downFile</param>
    </result>
<action>

特别注意:inputName中指定的参数对应于Action中的相应的返回InputStream的get方法

public InputStream getDownloadFile(){}

底层的原理是基于struts的valuestack+反射原理自动实现get/set方法。

2、指定文件路径下,不存在指定的文件

3、get方法中返回InputStream的方法不对,方法本身可能返回为null

InputStream is=ServletActionContext.getServletContext().getResourceAsStream("D:\\BeginLinuxProgramming.pdf");

如果使用getServletContext方法,网上的说法是文件必须保存在ServletContext中,千辛万苦实在不知道如何保存到servletContext中,直接改为:

File file = new File("D:\\BeginLinuxProgramming.pdf");
InputStream fileIStream = null;
try {
fileIStream= new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileIStream;