etmvc upload有关问题
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;
}
看起来应该是比较简单的。