首页 > 编程 > Java > 正文

两种java文件上传实例讲解

2019-11-26 14:11:37
字体:
来源:转载
供稿:网友

本文通过两种文件上传实例进行比较,帮助大家更好的学习java文件上传功能,具体内容如下

1. Java附件上传代码    

@Controllerpublic class UploadFile extends BaseJsonController{   /**   * 附件上传   *    * @param request   * @param creativeFile   * @param response   * @return   */  @RequestMapping(value = "/upload/uploadFile.json")  public void uploadFile(HttpServletRequest request,HttpServletResponse response) {    /**     * 1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。     * 2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。     * 3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。     * 4、要限制上传文件的最大值。     * 5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。     */     //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全    String savePath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload");    //上传时生成的临时文件保存目录    String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/temp");    File tmpFile = new File(tempPath);    if (!tmpFile.exists()) {      //创建临时目录      tmpFile.mkdirs();    }     //消息提示    JSONArray arr = new JSONArray();    Map<String,Object> map = null;         InputStream in = null;    FileOutputStream out = null;    try{      //使用Apache文件上传组件处理文件上传步骤:      //1、创建一个DiskFileItemFactory工厂      DiskFileItemFactory factory = new DiskFileItemFactory();      //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。      factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB      //设置上传时生成的临时文件的保存目录      factory.setRepository(tmpFile);      //2、创建一个文件上传解析器      ServletFileUpload upload = new ServletFileUpload(factory);      //监听文件上传进度      upload.setProgressListener(new ProgressListener(){        public void update(long pBytesRead, long pContentLength, int arg2) {          System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);        }      });      //解决上传文件名的中文乱码      upload.setHeaderEncoding("UTF-8");       //3、判断提交上来的数据是否是上传表单的数据      if(!ServletFileUpload.isMultipartContent(request)){        //按照传统方式获取数据        return;      }       //设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是20MB      upload.setFileSizeMax(1024*1024*20);      //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为40MB      upload.setSizeMax(1024*1024*40);      //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项      @SuppressWarnings("unchecked")      List<FileItem> list = upload.parseRequest(request);       for(FileItem item : list){        //如果fileitem中封装的是普通输入项的数据        if(item.isFormField()){          String name = item.getFieldName();          //解决普通输入项的数据的中文乱码问题          String value = item.getString("UTF-8");          //value = new String(value.getBytes("iso8859-1"),"UTF-8");          System.out.println(name + "=" + value);        }else{//如果fileitem中封装的是上传文件          //得到上传的文件名称,          String filename = item.getName();          if(filename==null || filename.trim().equals("")){            continue;          }          //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:/a/b/1.txt,而有些只是单纯的文件名,如:1.txt          //处理获取到的上传文件的文件名的路径部分,只保留文件名部分          filename = filename.substring(filename.lastIndexOf("//")+1);          //得到上传文件的扩展名          String fileExtName = filename.substring(filename.lastIndexOf(".")+1);          //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法          if(StringUtils.equals(fileExtName, "rar") || StringUtils.equals(fileExtName, "zip")){            throw new BizException("","禁止上传压缩文件!");          }                     /*************/          //获取item中的上传文件的输入流          in = item.getInputStream();          /************/           //得到文件保存的名称          String saveFilename = makeFileName(filename);          //得到文件的保存目录          String realSavePath = makePath(saveFilename, savePath);          //创建一个文件输出流          out = new FileOutputStream(realSavePath + "//" + saveFilename);          //创建一个缓冲区          byte buffer[] = new byte[1024];          //判断输入流中的数据是否已经读完的标识                 int len = 0;          //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据          while((len=in.read(buffer))>0){            //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "//" + filename)当中            out.write(buffer, 0, len);          }          //关闭输入流          in.close();          //关闭输出流          out.close();                 //删除处理文件上传时生成的临时文件                  item.delete();                 map = new HashMap<String,Object>();          map.put("saveFilename", saveFilename);          map.put("realSavePath", realSavePath);          arr.add(map);        }      }      returnSuccessJSON("上传成功", arr, response);     }catch (FileUploadBase.FileSizeLimitExceededException e) {      e.printStackTrace();      returnFailJSON(e.getMessage(), "单个文件超出最大值!!!", response);     }catch (FileUploadBase.SizeLimitExceededException e) {      e.printStackTrace();      returnFailJSON(e.getMessage(), "上传文件的总的大小超出限制的最大值!!!", response); arr.toString();    }catch (Exception e) {      e.printStackTrace();      returnFailJSON(e.getMessage(), "文件上传失败!", response); arr.toString();    }finally{      try {       //关闭输入流        in.close();       //关闭输出流        out.close();      } catch (IOException e) {               }    }  }   /**   * @Method: makeFileName   * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称   * @Anthor:xuwentao   * @param filename 文件的原始名称   * @return uuid+"_"+文件的原始名称   */  private String makeFileName(String filename){ //2.jpg    //为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名    return UUID.randomUUID().toString() + "_" + filename;  }    /**   * 为防止一个目录下面出现太多文件,要使用hash算法打散存储   * @Method: makePath   * @Description:    * @Anthor:xuwentao   *   * @param filename 文件名,要根据文件名生成存储目录   * @param savePath 文件存储路径   * @return 新的存储目录   */  private String makePath(String filename,String savePath){    //得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址    int hashcode = filename.hashCode();    int dir1 = hashcode&0xf; //0--15    int dir2 = (hashcode&0xf0)>>4; //0-15    //构造新的保存目录    String dir = savePath + "//" + dir1 + "//" + dir2; //upload/2/3 upload/3/5    //File既可以代表文件也可以代表目录      File file = new File(dir);    //如果目录不存在    if(!file.exists()){      //创建目录      file.mkdirs();    }    return dir;  }}

2. Java上传简历代码

/** * 上传简历 * 1--创建文件失败 2--异常 3--上传失败  4--文件未获取 5--文件未删除  6--请上传word、excel、ppt、pdf文件 */ /*路径分隔符:用于自适应操作系统*/ private static final String FILE_SEPARATOR = System.getProperties()   .getProperty("file.separator");  /** * 上传文件 *  * @param FileIO * @param oldContractURL * @param request * @return 返回文件地址(相对地址,非绝对地址) */ @Override public String upload(MultipartFile FileIO, String oldContractURL, HttpServletRequest request) {    String uploadUrl = request.getSession().getServletContext().getRealPath("files");   //删除文件及文件夹   if (oldContractURL != null) {     String oldDirectory = oldContractURL.substring(5,       oldContractURL.lastIndexOf(FILE_SEPARATOR));     File file = new File(uploadUrl + oldDirectory);     boolean flag = deleteDir(file);     if (!flag) {       logger.error("旧文件删除失败");       return "5";     }   }   //上传新的简历文件   long now = System.currentTimeMillis();   uploadUrl = uploadUrl + FILE_SEPARATOR + now + FILE_SEPARATOR;   String resumeName = "";   if (!FileIO.isEmpty()) {     resumeName = StringUtils.deleteWhitespace(FileIO.getOriginalFilename());     //判断文件后缀     /*String suffix = resumeName.substring(resumeName.lastIndexOf("."), resumeName.length())       .toLowerCase();     if (!".doc".equals(suffix) && !".docx".equals(suffix) && !".xls".equals(suffix)       && !".xlsx".equals(suffix) && !".ppt".equals(suffix) && !".pptx".equals(suffix)       && !".pdf".equals(suffix)) {       logger.error("不是word、excel、ppt、pdf文件");       return "6";     }*/   } else {     logger.error("文件未获取");     return "4";   }    File dir = new File(uploadUrl);   if (!dir.exists()) {     dir.mkdirs();   }   File targetFile = new File(uploadUrl + resumeName);   if (!targetFile.exists()) {     try {       targetFile.createNewFile();     } catch (IOException e) {       logger.error("文件创建失败", e);       return "1";     }   }   try {     FileIO.transferTo(targetFile);   } catch (IllegalStateException e) {     logger.error("语句异常", e);     return "2";   } catch (IOException e) {     logger.error("上传失败", e);     return "3";   }   return FILE_SEPARATOR + "files" + FILE_SEPARATOR + now + FILE_SEPARATOR + resumeName; }  /** * 递归删除目录下的所有文件及子目录下所有文件 * @param dir 将要删除的文件目录 * @return boolean Returns "true" if all deletions were successful. *         If a deletion fails, the method stops attempting to *         delete and returns "false". */ public boolean deleteDir(File dir) {   if (dir.isDirectory()) {     String[] children = dir.list();     //递归删除目录中的子目录下     for (int i = 0; i < children.length; i++) {       boolean success = deleteDir(new File(dir, children[i]));       if (!success) {         return false;       }     }   }   // 目录此时为空,可以删除   return dir.delete(); }

以上就是本文的全部内容,希望对大家的学习有所帮助,掌握java文件上传的技巧。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表