最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)文件上傳功能

 更新時間:2020年12月13日 12:00:26   作者:Randy_2019  
這篇文章主要為大家詳細介紹了java實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現(xiàn)文件上傳的具體代碼,供大家參考,具體內容如下

一、文件上傳準備工作

對于文件上傳,瀏覽器在上傳的過程中將文件以流的形式提交到服務器。
可以選擇apache的commons-fileupload包作為文件上傳組件,commons-fileupload包依賴于commons-io包。
可以在Maven導入該commons-fileupload包,Maven會幫我們導入依賴的jar包commons-io。

<dependency>
 <groupId>commons-fileupload</groupId>
 <artifactId>commons-fileupload</artifactId>
 <version>1.3.3</version>
</dependency>

二、文件上傳的主要步驟

  • 創(chuàng)建diskFileItemFactory對象,處理文件上傳路徑或者大小限制
  • 通過diskFileItemFactory對象作為ServletFileUpload類的參數(shù),創(chuàng)建ServletFileUpload對象
  • 處理上傳的文件

三、代碼實現(xiàn)

在文件上傳時,表單一定要加enctype=“multipart/form-data” 。只有使用enctype=“multipart/form-data”,表單才會把文件的內容編碼到HTML請求中。
默認enctype=“application/x-www-form-urlencoded”,表單的內容會按URL規(guī)則編碼。
而enctype="multipart/form-data"不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。

method也一定要使用post請求。

<form action="/file.do" enctype="multipart/form-data" method="post">
 <p>上傳用戶:<input type="text" name="username"></p>
 <p><input type="file" name="file1"></p>
 <p><input type="file" name="file2"></p>
 <p><input type="submit">|<input type="reset"></p>
</form>
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 //判斷上傳的是普通表單還是帶文件的表單
 if (!ServletFileUpload.isMultipartContent(req)) {
  return;
 }
 //創(chuàng)建上傳文件保存的地址,一般創(chuàng)建在WEB-INF目錄下,用戶無法直接訪問該目錄下的文件
 String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
 File uploadFile = new File(uploadPath);
 //如果文件夾不存在,則創(chuàng)建一個
 if (!uploadFile.exists()) {
  uploadFile.mkdir();
 }

 //創(chuàng)建上傳大文件的臨時地址,一般幾天后自動刪除,用戶可以手動刪除或者轉為永久文件
 // 一般創(chuàng)建在WEB-INF目錄下,用戶無法直接訪問該目錄下的文件
 String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
 File tempFile = new File(tempPath);
 //如果文件夾不存在,則創(chuàng)建一個
 if (!tempFile.exists()) {
  tempFile.mkdir();
 }

 //1.創(chuàng)建diskFileItemFactory對象,處理文件上傳路徑或者大小限制
 DiskFileItemFactory factory = getDiskFileItemFactory(tempFile);

 //2.獲取ServletFileUpload
 ServletFileUpload upload = getServletFileUpload(factory);

 //3.處理上傳的文件
 try {
  String msg = uploadParseRequest(upload, req, uploadPath);
  //轉發(fā)
  req.setAttribute("msg",msg);
  req.getRequestDispatcher("info.jsp").forward(req, resp);
 } catch (FileUploadException e) {
  e.printStackTrace();
 }
 }


 public DiskFileItemFactory getDiskFileItemFactory(File file) {
 DiskFileItemFactory factory = new DiskFileItemFactory();
 //創(chuàng)建一個緩存區(qū),當上傳文件大于設置的緩存區(qū)時,將該文件放到臨時目錄
 factory.setSizeThreshold(1024 * 1024);//緩存區(qū)大小為1M
 factory.setRepository(file);//臨時目錄
 return factory;
 }

 public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
 ServletFileUpload upload = new ServletFileUpload(factory);
 //監(jiān)聽文件上傳進度
 upload.setProgressListener(new ProgressListener() {
  @Override
  public void update(long uploaded, long totalSize, int i) {
  System.out.println("已上傳:"+(uploaded*100)/totalSize+"%");
  }
 });
 upload.setHeaderEncoding("UTF-8");//亂碼處理
 upload.setFileSizeMax(1024 * 1024 * 10);//設置單個文件的最大值10M
 upload.setSizeMax(1024 * 1024 * 100);//設置總共能上傳文件的最大值100M
 return upload;
 }

 public String uploadParseRequest(ServletFileUpload upload, HttpServletRequest req, String uploadPath) throws FileUploadException, IOException {
 String msg = "";
 //把前端請求解析,封裝成一個List對象
 List<FileItem> fileItems = upload.parseRequest(req);
 for (FileItem fileItem : fileItems) {
  if (fileItem.isFormField()) {//判斷上傳的文件是普通的表單還是帶文件的表單
  String name = fileItem.getName();//前端表單控件的name:username
  String value = fileItem.getString("UTF-8");//亂碼處理
  System.out.println(name + ":" + value);
  } else {//判斷為上傳的文件
  //==================處理文件=====================
  String uploadFileName = fileItem.getName();//前端表單控件的name
  System.out.println("上傳的文件名:" + uploadFileName);
  if (uploadFileName.trim().equals("") || uploadFileName == null) {//可能存在不合法的情況
   continue;
  }
  String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//文件名
  String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);//文件后綴名
  System.out.println("文件名:" + fileName + "--文件后綴:" + fileExtName);
  //==================存放地址==================
  String uuidPath = UUID.randomUUID().toString();
  //文件存儲的真實路徑
  String realPath = uploadPath + "/" + uuidPath;
  System.out.println("文件上傳到的位置:"+realPath);
  //給每個文件創(chuàng)建一個文件夾
  File realPathFile = new File(realPath);
  if (!realPathFile.exists()) {//如果文件夾不存在,則創(chuàng)建一個
   realPathFile.mkdir();
  }
  //==================文件傳輸==================
  //獲得文件上傳的流
  InputStream inputStream = fileItem.getInputStream();
  //創(chuàng)建一個文件輸出流
  FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
  //創(chuàng)建一個緩沖區(qū)
  byte[] buffer = new byte[1024 * 1024];
  //判斷讀取是否完畢
  int len = 0;
  while ((len = inputStream.read(buffer)) > 0) {
   fileOutputStream.write(buffer, 0, len);
  }
  //關閉流
  fileOutputStream.close();
  inputStream.close();
  msg = "上傳成功";
  fileItem.delete();//上傳成功,清除臨時文件
  }
 }
 return msg;
}

文件上傳的注意事項

1、為保證服務器安全,上傳的文件應該放在外界無法直接訪問的目錄下,例如放在WEB-INF目錄下。
2、為了防止文件覆蓋的現(xiàn)象,要為上傳的文件產(chǎn)生一個唯一的文件名(可以為每一個上傳的文件增加一個uuid或時間戳為名的文件夾)
3、限制上傳文件的最大值
4、限制上傳文件的類型,在收到上傳文件時,判斷其后綴名是否合法,是否為自己限制的類型

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++字符串的處理詳解

    C++字符串的處理詳解

    這篇文章主要介紹了C++ string字符串類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • maven項目無法讀取到resource文件夾的問題

    maven項目無法讀取到resource文件夾的問題

    這篇文章主要介紹了maven項目無法讀取到resource文件夾的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • IntelliJ IDEA之高效代碼插件RainBow Brackets詳解

    IntelliJ IDEA之高效代碼插件RainBow Brackets詳解

    這篇文章主要介紹了IntelliJ IDEA之高效代碼插件RainBow Brackets詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 微服務Spring Boot 整合 Redis 實現(xiàn)UV 數(shù)據(jù)統(tǒng)計的詳細過程

    微服務Spring Boot 整合 Redis 實現(xiàn)UV 數(shù)據(jù)統(tǒng)計的詳

    這篇文章主要介紹了微服務Spring Boot 整合 Redis 實現(xiàn) UV 數(shù)據(jù)統(tǒng)計,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • Java getParameter方法案例詳解

    Java getParameter方法案例詳解

    這篇文章主要介紹了Java getParameter方法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • java maven進階教學

    java maven進階教學

    這篇文章主要介紹了Maven進階教程的相關資料,文中講解非常細致,幫助大家開始學習maven,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • 淺談十個常見的Java異常出現(xiàn)原因

    淺談十個常見的Java異常出現(xiàn)原因

    這篇文章主要介紹了十個常見的Java異常出現(xiàn)原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • JavaGUI常用窗體組件與面板使用詳解

    JavaGUI常用窗體組件與面板使用詳解

    GUI即圖形用戶界面,它是基于圖形的界面,windows就是一個圖形用戶界面的操作系統(tǒng),而DOS是基于命令提示符的操作系統(tǒng),GUI編程就是編出一個圖形用戶界面的軟件,它使用圖形的方式,以菜單、按鈕、表示、圖文框等標準界面元素組成的用戶操作界面
    2023-03-03
  • maven中profile的使用

    maven中profile的使用

    本文主要介紹了maven中profile的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Slf4j+logback實現(xiàn)JSON格式日志輸出方式

    Slf4j+logback實現(xiàn)JSON格式日志輸出方式

    這篇文章主要介紹了Slf4j+logback實現(xiàn)JSON格式日志輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

额尔古纳市| 浦北县| 平潭县| 开平市| 德江县| 田阳县| 湘乡市| 大石桥市| 泰兴市| 九台市| 扶风县| 镇雄县| 武穴市| 博野县| 乌兰县| 龙川县| 西乌珠穆沁旗| 金山区| 神木县| 彭州市| 南京市| 桂平市| 太原市| 白玉县| 河曲县| 随州市| 黎川县| 临漳县| 商城县| 谢通门县| 乐昌市| 浪卡子县| 宜兰县| 邛崃市| 香河县| 高邮市| 安龙县| 花莲市| 五河县| 葵青区| 客服|