Struts2文件上传与下载问题

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自带的浏览器调试的时候则会出现文件下载的弹窗

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页