今天有些时间,把代码重构了一下,省去了一遍又一遍的重复劳动。
在写模块的时候,由于每个逻辑模块通常都有文件上传和下载的需求,通常为了不至于各个模块之间上传的文件的管理上的混乱,都要把每个模块的文件放在与模块对应的文件夹下,便于以后管理,这样每个模块的文件存放的路径就不同,之前是在每个模块中都有相应的文件上传和下载。一遍又一遍的重复代码,看着总不舒服,今天终于重构了下,写了个独立的文件上传下载模块,这样只需指定文件上传和下载路径,就可实现功能
。
先说下文件上传:
由于文件上传需要从jsp中得到上传的文件类型、文件名等,所以在action中必须要有相应的setter、getter方法,所以这些在每个action都要写,代码量不多,但又不想在每个action中都实现上传功能,所以采用在service层实现功能,在action中实现逻辑(主要是得到相应的参数)。具体实现如下:
public String fileUpload(File upload,String uploadFileName,String uploadDir){
String fileName = Tools.generateFileName(uploadFileName);
String finalPath = ServletActionContext.getServletContext()
.getRealPath(uploadDir) +"\\" + fileName;
File finalFile = new File(finalPath);
try {
FileUtils.copyFile(upload, finalFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileName;
}
其中fileUpload中的三个参数都是必要的,都是action中调用时传过来的。根据名字都能猜出相应的属性意义了,不赘述了。
下面说下文件下载:
文件下载就可以通用性更强的了,因为必须是下载已经存在的文件,两个条件就可找到(其实是一个绝对路径):1.文件名,2.所在目录
这样在jsp中用url传此两个属性到action,就可实现下载了。
/**
* @author zengwei
* @date 2011/7/23
*/
public class DownLoadAction extends ActionSupport {
private static final long serialVersionUID = 2008764912102102777L;
//文件名参数变量
private String fileName;
private String uploadDir;
public String getFileName() {
try {
fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return fileName;
}
public void setFileName(String fileName) {
try {
fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.fileName = fileName;
}
//从下载文件原始存放路径读取得到文件输出流
public InputStream getDownloadFile() {
return
ServletActionContext.getServletContext().getResourceAsStream(uploadDir+"\\"+fileName);
}
//如果下载文件名为中文,进行字符编码转换
public String getDownloadChineseFileName() {
String downloadChineseFileName = fileName;
try {
downloadChineseFileName = new String(downloadChineseFileName.getBytes(), "ISO8859-1");
return downloadChineseFileName;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
public String getUploadDir() {
return uploadDir;
}
public void setUploadDir(String uploadDir) {
this.uploadDir = uploadDir;
}
}
配置如下:
<action name="download" class="DownLoadAction">
<!-- 设置文件名参数,由页面上传入 -->
<param name="fileName"></param>
<param name="uploadDir"></param>
<result name="success" type="stream">
<!-- 下载文件类型定义 -->
<param name="contentType">text/plain</param>
<!-- 下载文件处理方法 -->
<param name="contentDisposition">
attachment;filename="${downloadChineseFileName}"
</param>
<!-- 下载文件输出流定义 -->
<param name="inputName">downloadFile</param>
</result>
</action>
其实只是加了个uploadDir参数,用于接收jsp传过来的参数,与代码中的uploadDir对应。
End……