您好,登錄后才能下訂單哦!
這篇文章主要介紹了JavaWeb怎么實現簡單上傳文件功能的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JavaWeb怎么實現簡單上傳文件功能文章都會有所收獲,下面我們一起來看看吧。
基本思想:網站服務器的內部除了有Web應用,還有文件系統,客戶端向網站上傳文件就是將文件以流的形式傳輸給了服務器,如圖所示:
注意事項:
1、為保證服務器的安全,上傳的文件路徑應放在外界不能直接訪問的目錄下,比如WEB-INF目錄下。
2、因為服務器的文件系統大小有限,上傳的文件大小必須要有限制。
3、為防止因為文件名重復而導致文件覆蓋,應當給上傳的文件夾生成唯一的標識,比如時間戳、UUID或者md5加密。
4、可以限制上傳文件的類型,在收到文件的時候,判斷文件后綴是否合法。
在JavaWeb中,一般我們使用ServletFileUpload類來處理上傳的文件數據,它使用parseRequest方法將表單的每一個輸入項封裝成一個FileItem對象,并以list的形式返回,處理數據比較簡短,方便。
下面是一個上傳文件的小demo,編輯器是IDEA,項目類型是Maven Webapp。
package com.xiaojing.servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; import java.util.UUID; public class FileUploadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //判斷表單是普通表單,還是上傳文件表單 if(!ServletFileUpload.isMultipartContent(req)){ return; } //創建上傳文件的路徑,一般放在/WEB-INF下,比較安全 String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload"); File uploadFile = new File(uploadPath); if(!uploadFile.exists()){ uploadFile.mkdir(); } //如果上傳的文件大小超過了限制,那么會將這個文件放在臨時文件夾,過段時間提醒用戶刪除或者轉為永久 String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp"); File tempFile = new File(tempPath); if(!tempFile.exists()){ tempFile.mkdir(); } //1、創建DiskFileItemFactory對象 DiskFileItemFactory factory = new DiskFileItemFactory(); //2、獲取ServletFileUpload對象 ServletFileUpload upload = new ServletFileUpload(); upload.setFileItemFactory(factory); //3、處理上傳文件 //將前端請求封裝成Fileitem對象,每一個表單輸入項都是一個Fileitem對象 try { List<FileItem> items = upload.parseRequest(req); for (FileItem item: items) { if(item.isFormField()){ //如果是普通的表單 //getFieldName()是input的name屬性,getString()是input的value屬性 String fieldName = item.getFieldName(); String value = item.getString("UTF-8"); System.out.println(fieldName + ":" +value); }else{ //上傳文件的表單 //---------------處理文件------------------// String uploadFileName = item.getName(); System.out.println("上傳的文件名:"+uploadFileName); if(uploadFileName == null || uploadFileName.trim().equals("")){ continue; } //獲取fileName文件名,uploadFileName一般是url/文件路徑/文件 String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1); //獲取文件后綴 String fileExt = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1); System.out.println("文件信息:"+fileName); //---------------處理地址-----------------// //使用UUID唯一標識存放文件夾 String uuidPath = UUID.randomUUID().toString(); //獲取真實的文件夾地址 String realPath = uploadPath + "/" + uuidPath; File realFile = new File(realPath); if(!realFile.exists()){ realFile.mkdir(); } //---------------處理文件流-----------------// //獲取文件上傳的流 InputStream inputStream = item.getInputStream(); //創建一個文件輸出流 FileOutputStream outputStream = new FileOutputStream(realFile + "/" + fileName); //創建一個緩沖區 byte[] buffer = new byte[1024 * 1024]; int len = 0; while((len = inputStream.read(buffer)) > 0){ //每次讀寫1M outputStream.write(buffer,0,len); } outputStream.close(); inputStream.close(); String msg = "文件上傳成功"; System.out.println("文件上傳成功"); //清除臨時文件 item.delete(); //轉發 req.setAttribute("msg",msg); req.getRequestDispatcher("index.jsp").forward(req,resp); } } } catch (FileUploadException e) { e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
關于“JavaWeb怎么實現簡單上傳文件功能”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JavaWeb怎么實現簡單上傳文件功能”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。