文件上传之路

来源:互联网 发布:上海电脑数据恢复 编辑:程序博客网 时间:2024/06/04 20:11
刚接到这个问题的时候,我就看了项目中之前的例子,看了会,没有看懂,
之后我就尝试自己写,想使用servlet去完成这个问题,是写在action中的

//1. 创建工厂类  DiskFileItemFactory factory = new DiskFileItemFactory() ;  factory.setSizeThreshold(4096) ;//设置缓冲区大小,这里是4kb  factory.setRepository(tempPathFile) ;//设置缓冲区目录  //2. 创建fileUpload对象  ServletFileUpload upload = new ServletFileUpload(factory) ;  upload.setSizeMax(4*1024*1024) ;//设置最大文件尺寸,这里是4MB  //3. 判断是否是上传表单//  boolean flag = upload.isMultipartContent(request) ;//  if (!flag) {//   //不是文件上传//   request.setAttribute("message", "对不起,不是文件上传表单!") ;//   return ;//直接退出//  }//4. 解析request,获得FileItem项  List<FileItem> fileItems = new ArrayList<FileItem>();  try {   fileItems = upload.parseRequest(request) ;   //5. 遍历集合   for (FileItem item:fileItems) {    //判断是不是普通字段    if (item.isFormField()) {     String name = item.getFieldName() ;     String value = item.getString() ;     //手工转换     value = new String(value.getBytes("iso-8859-1"),"utf-8") ;     System.out.println(name+" = "+value);    }else{     //文件上传字段     //获得文件名     String fileName = item.getName() ;     System.out.println("文件名称:"+fileName);     fileName = fileName.substring(fileName.lastIndexOf("\\")+1) ;     System.out.println("文件名称:"+fileName);          //创建文件     ServletContext context = ((HttpServlet)request).getServletContext() ;     String dir = context.getRealPath("/WEB-INF/upload") ;     File file = new File(dir,fileName) ;     file.createNewFile() ;          //获得流,读取数据写入文件     InputStream ins = item.getInputStream() ;     FileOutputStream fos = new FileOutputStream(file) ;          int len ;     byte[] buffer = new byte[BUFFER_SIZE] ;     while ((len = ins.read(buffer))>0) {      fos.write(buffer,0,len) ;     }          //关闭     fos.close() ;     ins.close();     item.delete() ;//删除临时文件          request.setAttribute("message", "success") ;    }   }        } catch (FileUploadException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (UnsupportedEncodingException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }

但是 upload.parseRequest(request) ;获取的结果总是empty,一直想不明白了。。

String uploadTo = ""; try { request.setCharacterEncoding("utf-8") ; uploadTo = ServletActionContext.getServletContext().getRealPath("\\")+"upload\\" ;// uploadTo = request.getSession().getServletContext().getRealPath("\\")+"upload\\" ; initTemp();//初始化缓冲区 } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //1. 创建工厂类 DiskFileItemFactory factory = new DiskFileItemFactory() ; factory.setSizeThreshold(4096) ;//设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile) ;//设置缓冲区目录 //2. 创建fileUpload对象 ServletFileUpload upload = new ServletFileUpload(factory) ; upload.setSizeMax(4*1024*1024) ;//设置最大文件尺寸,这里是4MB //3. 判断是否是上传表单// boolean flag = upload.isMultipartContent(request) ;// if (!flag) {// //不是文件上传// request.setAttribute("message", "对不起,不是文件上传表单!") ;// return ;//直接退出// } //是文件上传表单 MultipartHttpServletRequest multiPartRequest = (MultipartHttpServletRequest)request ; Iterator iterator = multiPartRequest.getFileNames() ; if(iterator.hasNext()) { String fileName = iterator.next().toString() ; System.out.println("******fileName*****"+fileName); MultipartFile multipartFile = multiPartRequest.getFile(fileName) ; System.out.println("********file.size():**********"+multipartFile); }


但是一直报一个错误,说的是MultiPartRequestWrapper cannot be cast to MultipartHttpServletRequest,要不然就重新写一个servlet,更繁琐,就再次看之前的
代码,这次看下去了。原来是使用的struts2的上传,我说呢,为什么老报莫名其妙的错误,原来是都是struts2的封装引起的。
html:
<%-- 记住这里需要设置enctype="multipart/form-data"--%>   <s:form action="userInfo" method="post" enctype="multipart/form-data">      导入Excel文件:<s:file name="uploadFile"></s:file> <br/>     <s:submit value="导入"></s:submit>   </s:form>

Action:

private File uploadFile ;//上传的文件 private String uploadFileFileName ;//保存原始文件名 public void userinfo(){String uploadTo = ServletActionContext.getServletContext().getRealPath("\\")+ "upload\\" + new SimpleDateFormat("yyyMMddHHmmssSS").format(new Date())+".xls" ; File toFile = new File(uploadTo) ; copyTo(srcFile,toFile) ;//上传}public void copyTo(File srcFile,File toFile){ FileInputStream in = null ; FileOutputStream out = null ; try { in = new FileInputStream(srcFile) ; out = new FileOutputStream(toFile) ; byte[] buffer = new byte[BUFFER_SIZE] ; while (in.read(buffer) > 0) { out.write(buffer) ; } } catch (Exception e) { e.printStackTrace() ; }finally { try { if(null!=in){ in.close() ; } if(null!=out){ out.close() ; } } catch (Exception e) { e.printStackTrace() ; } } }

0 0
原创粉丝点击