<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了JavaWeb實現上傳檔案的具體程式碼,供大家參考,具體內容如下
這是需要使用到的兩個jar包一定要匯入到lib目錄中,並新增到釋出的lib目錄下
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="upload.jsp" rel="external nofollow" >點選上傳檔案</a> </body> </html>
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上傳檔案頁面</title> </head> <body> <form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post"> <p>請輸入使用者: <input type="text" name="username"></p> <p>上傳檔案: <input type="file" name="file"></p> <p><input type="submit"></p> </form> </body> </html>
UpLoadServlet
package com.pzy.servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.util.List; import java.util.UUID; public class UpLoadServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { doGet(request,response); } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { try { //先判斷提交的是普通請求還是帶有檔案的請求 if(!ServletFileUpload.isMultipartContent(request)){ return;//如果是普通檔案,直接返回 }//如果通過了這個if,那說明表單是帶有檔案的 //建立上傳檔案的儲存路徑,建議在WEB-INF下,因為這個資料夾是安全的,使用者是無法存取這個資料夾的 String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload"); File uploadFile = new File(uploadPath); //判斷這個資料夾是否存在 if(!uploadFile.exists()){ uploadFile.mkdir(); } //建立一個臨時路徑, 假如檔案超過了預期的大小,我們就把他放在一個臨時檔案下,過幾天自動刪除,或者提醒使用者轉存為永久 String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp"); File file = new File(tmpPath); //判斷資料夾是否存在 if(!file.exists()){ file.mkdir();//沒有的話就建立一個這樣的目錄 } /*處理上傳的檔案,一般都需要通過流來獲取,我們可以使用request.getInputStream(),原生態的檔案上傳流獲取,十分麻煩 *我們建議使用Apache的檔案上傳元件來實現,commons-fileupload,它需要依賴於common-io */ //1.建立DiskFileItemFactory物件,處理檔案上傳路徑和大小限制的; DiskFileItemFactory factory=getDiskFileItemFactory(file); //2.獲取ServletFileUpLoad ServletFileUpload upload=getServletFileUpLoad(factory); //3.處理上傳的檔案 String msg=uploadParseRequest(upload,request,uploadPath); //servlet請求轉發訊息 request.setAttribute("msg",msg); request.getRequestDispatcher("msg.jsp").forward(request,response); } catch (FileUploadException e) { e.printStackTrace(); } } public static DiskFileItemFactory getDiskFileItemFactory(File file) { DiskFileItemFactory factory = new DiskFileItemFactory(); //通過這個工廠設定一個緩衝區,當上傳的檔案大於這個緩衝區的時候,將他放入臨時檔案中 factory.setSizeThreshold(1024*1024);//此時設定緩衝區大小為1M factory.setRepository(file);//臨時目錄的儲存目錄,需要一個file return factory; } public static ServletFileUpload getServletFileUpLoad(DiskFileItemFactory factory) { ServletFileUpload upload = new ServletFileUpload(factory); //監聽檔案上傳進度 upload.setProgressListener(new ProgressListener() { @Override //pBytesRead是已經讀取的檔案大小 //pContentLength是檔案的大小 public void update(long pBytesRead, long pContentLength, int pItems) { System.out.println("總大小:"+pContentLength+"目前上傳大小:"+pBytesRead); } }); //處理亂碼問題 upload.setHeaderEncoding("UTF-8"); //設定單個檔案的最大值 upload.setFileSizeMax(1024*1024*10);//最大值為10m //設定總共檔案能夠上傳的檔案大小 upload.setSizeMax(1024*1024*10); return upload; } public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath) throws FileUploadException, IOException { String msg=""; //把前端請求進行解析,封裝成一個FileItem物件 List<FileItem> fileItems = upload.parseRequest(request); for(FileItem fileItem:fileItems){ if(fileItem.isFormField()){//判斷上傳的檔案是普通的表單還是帶檔案的表單 //getFieldName指的是前端表單控制元件的name; String name = fileItem.getFieldName(); String value = fileItem.getString("UTF-8");//處理亂碼 System.out.println(name+":"+value); }else{//判斷它是上傳的檔案 //============================================處理檔案================================= //拿到檔案的名字 String uploadFileName = fileItem.getName(); System.out.println("上傳的檔名是:"+uploadFileName); if(uploadFileName.trim().equals("")||uploadFileName==null){ continue; } //獲得上傳的檔名 (一般進來的檔案都會包含目錄.例如/image/girl/pop.png) String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1); //獲得字尾 String fileExtName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1); /* 如果檔案字尾名fileExtName不是我們需要的就直接return,不處理,告訴使用者檔案型別不對 */ System.out.println("檔案資訊名:"+fileName+"----檔案型別"+fileExtName); //可以使用UUID(唯一識別的通用碼),保證檔名的唯一; //UUID.randomUUID(),隨機生成一個唯一識別的通用碼; String uuidPath = UUID.randomUUID().toString(); //==========================檔案處理完畢===================================== //存到哪? uploadPath //檔案的真實存在路徑 realPath String realPath=uploadPath+"/"+uuidPath; //給每個檔案建立一個對應的資料夾 File realPathFile = new File(realPath); if(!realPathFile.exists()){ realPathFile.mkdir(); } //=================================存放地址完畢======================================== //獲得檔案上傳的流 InputStream inputStream = fileItem.getInputStream(); //建立一個檔案輸出流 //realPath=真實的資料夾 //這只是到最後一級的目錄,還差一個檔案;加上輸出檔案的名字+"/"uuidFileName; FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName); //建立一個緩衝區 byte[] buffer=new byte[1024*1024]; //判斷是否讀取完畢 int len=0; while((len=inputStream.read(buffer))>0){ fos.write(buffer,0,len); } //關閉流 fos.close(); inputStream.close(); msg="檔案上傳成功!"; fileItem.delete();//上傳完成,刪除臨時檔案 //===========================檔案傳輸完成================== } } return msg; } }
msg.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>訊息提示</title> </head> <body> ${msg} </body> </html>
WEB-XML
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>UpLoadServlet</servlet-name> <servlet-class>com.pzy.servlet.UpLoadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UpLoadServlet</servlet-name> <url-pattern>/upload.do</url-pattern> </servlet-mapping> </web-app>
上傳成功後,可以看到upload資料夾下存在一個有uuid碼組成的資料夾,資料夾下是我們上傳的檔案
總結:
1、為保證伺服器安全,上傳檔案應該放在外界無法直接存取的目錄下,比如放於WEB-INF目錄下。
2、為防止檔案覆蓋的現象發生,要為上傳檔案產生一個唯一的檔名,我們採用為每一個檔案建立一個獨一無二的UUID資料夾來儲存檔案,即使上傳了兩個相同的檔案,也要被儲存在不同UUID檔名的目錄中
3、要限制上傳檔案的最大值,大於最大值會被存放為臨時檔案
4、由於JVM執行的是class檔案,我們的java檔案被編譯為class檔案是存放在web目錄中的,因此,最後的上傳地址也是在web目錄下
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45