Struts2学习过程中需要实现文件的上传与下载,其中踩了不少坑,随手记一下。
1.文件上传后找不到
这个问题是由于没有保存文件引起的,Struts2框架实现了文件的上传,且存了临时文件,但是action结束后就自动删除了,如图
因此需要手动实现文件的保存,此处代码是两个文件在一个表单中上传的保存
private File myfile[];
private String myfileContentType[];
private String myfileFileName[];
private String savePath;
private String username;
private String major;
private int grade;
public String execute() throws Exception {
// TODO Auto-generated method stub
String Path = ServletActionContext.getServletContext().getRealPath(savePath);
File dir = new File(Path);
if (!dir.exists())
dir.mkdir();
String fileName[] = new String [2];
for (int i = 0; i < myfile.length; i++) {
fileName[i]=major+"-" + grade+"-" +myfileFileName[i];
FileOutputStream fos = new FileOutputStream(Path + "\\" + fileName[i]);
FileInputStream fis = new FileInputStream(myfile[i]);
byte[] buf = new byte[4096];
int len = -1;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
fos.close();
fis.close();
}
ActionContext.getContext().getValueStack().set("filename", fileName);
return SUCCESS;
}
2.上传成功后,通过地址直接访问文件出现404错误,但是能在服务器路径下手动查看到文件
这个问题的原因有几个可能:文件路径不正确;struts.xml配置问题;tomcat配置问题等几个原因
1)文件路径的表示
<img src="${pageContext.servletContext.contextPath}/uploadfile/${filename[0]}">
<a href="${pageContext.servletContext.contextPath}/uploadfile/${filename[1]}">我的简历</a>
注意,此处标签内不能使用"+"符号来拼接文件名,会引起报错
2)struts.xml配置问题
原因是web.xml中配置了过滤/*,如下
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping></web-app>
/*意味着框架会过滤所有请求,包括css、js、图片等静态资源的引用,解决方案如下:
在struts.xml中配置不过滤的文件夹即可
<constant name="struts.action.excludePattern" value="/uploadfile/.*?" />
<constant name="struts.action.excludePattern" value="/download/.*?" /><!-- default locale -->
这种问题在SpringMVC中也有出现,解决方案类似
3)tomcat配置问题
如果需要引用的静态资源文件名为中文,在tomcat配置文件中没有配置编码,则会出现404错误
解决方案:在tomcat/conf文件夹下server.xml配置如下
具体配置如下:
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="utf-8"
connectionTimeout="20000"
redirectPort="8443" />
3.文件下载时文件名出现中文乱码
在返回流对象前设置fileName的编码
public InputStream getTargetFile() throws FileNotFoundException, UnsupportedEncodingException{
filename=major+"-"+grade+".docx";
System.out.println(filename);
String filePath = ServletActionContext.getServletContext().getRealPath("/download/"+filename);
System.out.println(filePath);
InputStream is = new FileInputStream(new File(filePath));
filename=URLEncoder.encode(filename, "UTF-8");
return is;
}
4.点击文件下载的链接后不出现弹窗提示,直接下载
这种情况是浏览器的问题,我在调试的过程中使用的chrome就不会弹窗,直接保存到设置的默认地址了,而使用myeclipse自带的浏览器调试的时候则会出现文件下载的弹窗