国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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("http://")+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 + "http://" + saveFilename);          //創建一個緩沖區          byte buffer[] = new byte[1024];          //判斷輸入流中的數據是否已經讀完的標識                 int len = 0;          //循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據          while((len=in.read(buffer))>0){            //使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + "http://" + 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 + "http://" + dir1 + "http://" + 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文件上傳的技巧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏东市| 金塔县| 甘泉县| 安岳县| 祁连县| 惠州市| 茂名市| 会宁县| 金塔县| 军事| 潢川县| 铁力市| 海南省| 阿拉善左旗| 宾川县| 和政县| 永川市| 黔南| 万源市| 老河口市| 桦川县| 凤山县| 资溪县| 蓝山县| 蓬溪县| 潜江市| 沭阳县| 通河县| 怀远县| 鞍山市| 林口县| 临沧市| 防城港市| 昌黎县| 永寿县| 望江县| 准格尔旗| 南靖县| 崇信县| 武穴市| 通江县|