文件上传之路

刚接到这个问题的时候,我就看了项目中之前的例子,看了会,没有看懂,
之后我就尝试自己写,想使用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() ; } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值