javaweb實現圖片檔案上傳
阿新 • • 發佈:2018-11-09
圖片上傳到檔案中,可以直接上傳圖片到目錄中,也還可以將圖片檔名、檔案路徑寫入到資料庫中,也可以在程式中動態的建立檔案路徑。
參看:http://blog.csdn.net/lmdcszh/article/details/9201173
package com.ioif.wha.imageUpload; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { private File uploadPath; private File tempPath; public void init() throws ServletException { // 在系統啟動的時候,就開始初始化,檢查上傳圖片的資料夾和存放臨時檔案的資料夾是否存在,如果不存在,就建立 //獲取根目錄對應的真實物理路徑 uploadPath = new File(getServletContext().getRealPath("upload")); System.out.println("uploadPath======="+uploadPath); //如果目錄不存在 if(!uploadPath.exists()){ //建立目錄 uploadPath.mkdir(); } //臨時目錄 // File tempFile = new File(item.getName())構造臨時物件 tempPath = new File(getServletContext().getRealPath("temp")); System.out.println("tempPath======="+tempPath); if(!tempPath.exists()){ tempPath.mkdir(); } //如果不顯示呼叫父類方法,就不會有itemManager例項,因此會造成空指標 super.init(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("---doPost--"); //從item_upload.jsp中拿取資料,因為上傳頁的編碼格式跟一般的不同,使用的是enctype="multipart/form-data" // form提交採用multipart/form-data,無法採用req.getParameter()取得資料 // String itemNo = req.getParameter("itemNo"); // System.out.println("itemNo======" + itemNo); /********************************使用 FileUpload 元件解析表單********************/ //DiskFileItemFactory:建立FileItem 物件的工廠,在這個工廠類中可以配置記憶體緩衝區大小和存放臨時檔案的目錄 DiskFileItemFactory factory = new DiskFileItemFactory(); //設定是否將上傳檔案已臨時檔案的形式儲存在磁碟的臨界值(以位元組為單位的int值),如果從沒有呼叫該方法設定此臨界值,將會採用系統預設值10KB。對應的getSizeThreshold() 方法用來獲取此臨界值 factory.setSizeThreshold(4096);//4kb //設定當上傳檔案尺寸大於setSizeThreshold方法設定的臨界值時,將檔案以臨時檔案形式儲存在磁碟上的存放目錄。有一個對應的獲得臨時資料夾的 File getRespository() 方法 factory.setRepository(tempPath); //ServletFileUpload:負責處理上傳的檔案資料,並將每部分的資料封裝成一到 FileItem 物件中。 //在接收上傳檔案資料時,會將內容儲存到記憶體快取區中,如果檔案內容超過了 DiskFileItemFactory 指定的緩衝區的大小, //那麼檔案將被儲存到磁碟上,儲存為 DiskFileItemFactory 指定目錄中的臨時檔案。 //等檔案資料都接收完畢後,ServletUpload再從檔案中將資料寫入到上傳檔案目錄下的檔案中 ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(1000000 * 20); /*******************************解析表單傳遞過來的資料,返回List集合資料-型別:FileItem***********/ try{ List<FileItem> fileItems = upload.parseRequest(request); String itemNo = ""; //Iterator iter = fileItems.iterator()取其迭代器 //iter.hasNext()檢查序列中是否還有元素 System.out.println("---fileItems--"+fileItems.size()); for (Iterator iter = fileItems.iterator();iter.hasNext(); ) { //獲取序列中的下一個元素 FileItem item = (FileItem) iter.next(); System.out.println("---5555--"); //判斷是檔案還是文字資訊 //是普通的表單輸入域 if(item.isFormField()){ if("itemNo".equalsIgnoreCase(item.getFieldName())){ itemNo = item.getString(); System.out.println("itemNo======="+itemNo); } } //是否為input="type"輸入域 if(!item.isFormField()){ //上傳檔案的名稱和完整路徑 String fileName = item.getName(); long size = item.getSize(); //判斷是否選擇了檔案 if(fileName == null || fileName.equals("") && size == 0){ continue; } //擷取字串 如:C:\WINDOWS\Debug\PASSWD.LOG fileName = fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length()); System.out.println("fileName======="+fileName); // 儲存檔案在伺服器的物理磁碟中:第一個引數是:完整路徑(不包括檔名)第二個引數是:檔名稱 //item.write(file); //修改檔名和物料名一致,且強行修改了副檔名為gif //item.write(new File(uploadPath, itemNo + ".gif")); //將檔案儲存到目錄下,不修改檔名 item.write(new File(uploadPath, fileName)); } } }catch(Exception e){ e.printStackTrace(); // throw new ApplicationException("上傳失敗", null); } } }
注:
解析表單傳遞過來的資料,通過upload.parseRequest(request)返回List集合資料-型別:FileItem,測試時,request正常提交了表單,但還是出現parseRequest(request)為空,list.size()為0的情況,問題可能出在web.xml檔案上,和filter有關,配置struts那裡
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這樣所有的檔案都會被struts攔截,顯然這是不恰當的,我就改成了下面這樣。
<url-pattern>*.do,*.action</url-pattern>
然後上傳功能就又恢復正常了
參看:http://blog.csdn.net/en_reading/article/details/52486804