最近做一个关于文件上传下载的项目的时候,碰到几个问题:
1. 文件上传时<s:file name="upload" label="上传论文" ></s:file>,此name属性要有三个对应Action属性
private File upload;
private String uploadFileName;
private String uploadContentType;
2. 文件上传的存放路径,如果只是自己做测试,不用放到磁盘上,用
String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
获得项目的相对路径,放在了Tomcat服务器上,在webapp下的相应发布项目里面,每次重启服务器上传的文件都会消失,
是重新发布了。
if(!saveDir.exists()) {
File saveFile = new File(saveDir,uploadFileName);
try {
FileUtils.copyFile(upload, saveFile);
} catch (IOException e) {
System.out.println("文件上传出错!!");
e.printStackTrace();
return "error";
}
}
如果是要运行项目的话建议存在磁盘上将这里File saveFile = new File(saveDir,uploadFileName);加粗改成自己定义的路径;
3. 文件下载的时候,就像上面说的,如果你重新发布了,那么你想要下载你在上次发布时上传的文件的话肯定不会成功的,
文件名中文的话要做处理,如果不作处理可能会碰到这样的问题:
java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [imageStream] in the invocation stack.
Check the <param name="inputName"> tag specified for this action
我碰到这个问题的时候一开始以为是Check the <param name="inputName"> tag specified for this action这里的问题
但是在网上查到,是因为inputStream返回为null才引起的这个错误,我将文件路径和文件名打印出来以后看到是因为文件名为乱码
然后就是改正乱码了,开始我这样改的:
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("文件名出错");
e.printStackTrace();
}
return downFileName;
}
但是还是不对,又在配置文件中加入
action name="download" class="net.zjl.action.DownloadFileAction">
<result type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">4096</param>
<param name="contentDisposition">attachment;fileName="${downloadFileName}"</param>
</result>
</action>中的粗体字符集,可还是不好使,
最后就做很多尝试,终于解决,方法如下:
public void setFileName(String fileName) {
try {
this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在文件名的setter方法里面有转换一下编码然后就好使了;总之碰到的也就是乱码问题;
在配置文件中还要
4. 最头疼的是在我写完下载Action以后,觉得没什么问题,但是就是报错NO defined Action XXX and result success )not aviable,
反复检查配置文件有没有写错,但真的就没有错,一气之下删掉重写,惊奇的发现竟然好使了,真是愁人啊,和我另一篇 getHibernateTemplate()为null
时一样哪里都没写错,就是不能正常从Spring配置文件中获取getHibernateTemplate()。