et-mvc上传文件是对Commons-fileupload组件的封装,所以使用时需要引入commons-fileupload.jar, commons-io.jar, commons-logging.jar三个包。
上传文件的第一步就是象下面一样创建一个multipart/form-data表单:
<form action="/upload/doUpload" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>然后编写控制器,定义上传的Action方法:
public class UploadController extends ApplicationController{
public String doUpload(MultipartFile file) throws Exception{
file.transferTo(new File("e:/temp/" + file.getOriginalFilename()));
return file.getOriginalFilename()+":"+file.getSize();
}
}
上传的方法,封装好了,可以获取表单里正常传入的值。
上传时候,用原始的方法却上传不成功(代码如下):
boolean isFileUpload = ServletFileUpload.isMultipartContent(request);//检测是否存在文件上传的请求
if(isFileUpload){
// 处理磁盘文件工厂类
FileItemFactory factory = new DiskFileItemFactory();
// 文件上传的处理类
ServletFileUpload upload = new ServletFileUpload(factory);
//解析上传的文件
List fileItems = upload.parseRequest(request);
for (Iterator iterator = fileItems.iterator(); iterator.hasNext();){
FileItem fileItem= (FileItem) iterator.next();
if(!fileItem.isFormField()){
}else{
String contentType = fileItem.getContentType().toLowerCase();// 比如:image/pjpg
//进行格式的判断
if (contentType.indexOf("excel") != -1) {
//对文件上传的处理
String fileUploadPath=fileItem.getName();
// 上传之后文件的名字要唯一:采用当前上传的系统时间的毫秒数作为文件的名字
String time = System.currentTimeMillis() + "";// 当前系统时间
String postfix = fileUploadPath.substring(fileUploadPath.lastIndexOf("."));//获取文件的后缀名
String fileName = time+postfix;
String contextPath =this.getServletContext().getRealPath("upload");//获取工程中的名为upload的目录
System.out.println(contextPath);
filePath = contextPath+File.separator+fileName;
file = new File(filePath);//代表上传文件的目录
System.out.println("上传成功!");
FileOutputStream output = new FileOutputStream(file);
InputStream in = fileItem.getInputStream();
IOUtils.copy(in,output);
IOUtils.closeQuietly(output);//关闭输出流
IOUtils.closeQuietly(in);//关闭输出流
b = true;
continue;
}else {
System.out.println("文件格式错误");
continue;
}
}
}
}
这种方法,总是在List fileItems = upload.parseRequest(request);这里获取不到值,还没确定原因,有待于进一步研究。
需要下载文件时,可以使用BinaryView,如下所示:
public BinaryView download() throws Exception{
BinaryView view = BinaryView.loadFromFile("e:/temp/arrow.gif");
view.setContentType("image/gif");
//view.setContentDisposition("attachment"); //下载
return view;
}
看起来应该是比较简单的。