這篇文章主要為大家展示了“java如何實現上傳圖片文件功能”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java如何實現上傳圖片文件功能”這篇文章吧。
總的說圖片上傳有兩種方式,一種是把圖片文件寫到數據庫中,另一種是存到服務器文件目錄中。寫到數據庫中的圖片文件需要轉換成二進制流的格式,占用數據庫空間比較,適合少量圖片的存儲,比如說,系統中某些小圖標,寫到數據庫中的優點是比較安全,不容易被用戶不小心刪除。
如果是大量的圖片的存儲通常的做法是保存到服務器的某個文件夾中。而完成上傳有很多方式,可以采用流的方式,可以采用ftp的方式,這里采用fileupload方式。
隨著系統規模的不同,對圖片文件的處理方式也不盡相同。如果系統中圖片的數量不是很大,直接把所有的圖片存儲到同一個目錄下即可。如果圖片的積累比較多,可以根據物資分類對圖片進行相應的分類儲存,這樣會節省一些在磁盤中查找文件的時間。
圖片上傳到文件中,可以直接上傳圖片到目錄中,也還可以將圖片文件名、文件路徑寫入到數據庫中,也可以在程序中動態的創建文件路徑。如果公司中要求圖片要用專門的服務器存放,這時候把文件路徑寫活還是比較合適的。一般的如果一種物資(物料)對應一張圖片是比較容易處理的。如果對應多張圖片,處理起來就需要配合循環使用。一方面,需要處理圖片的動態顯示,另一方面要檢查圖片文件命名是否重復。另外再圖片處理(上傳、刪除、修改)的時候需要配合事務。
下面重點介紹一下使用fileupload方式實現圖片上傳的最基本的實現。
1、前端使用file標簽:
<input name = "fileName" type ="file" class ="text1" size ="40" maxlength="40">
2、設置文件的enctype格式:multipart/form-data
<form name="itemForm" target="_self" id="itemForm" method="post" action="servlet/item/FileUploadServlet" enctype="multipart/form-data" >
關于enctype="multipart/form-data" 的說明:
在jsp中使用了該格式,對應的Servlet就不能使用request.getParameter()取得參數,要使用ServletFileUpload對象的parseRequest方法先把request對象中的數據解析,然后,使用解析出的元素的isFormField標志,配合getFieldName方法來獲取數據。
3、FileUploadServlet的實現:
package com.bjpowernode.drp.basedata.web; import java.io.File; import java.io.IOException; 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; import com.bjpowernode.drp.basedata.manager.ItemManager; import com.bjpowernode.drp.basedata.manager.ItemManagerImpl; import com.bjpowernode.drp.util.ApplicationException; public class FileUploadServlet extends AbstractItemServlet { private File uploadPath; private File tempPath; @Override 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")); 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 { //從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(); // maximum size that will be stored in memory factory.setSizeThreshold(4096); // the location for saving data that is larger than getSizeThreshold() factory.setRepository(tempPath); //ServletFileUpload:負責處理上傳的文件數據,并將每部分的數據封裝成一到 FileItem 對象中。 //在接收上傳文件數據時,會將內容保存到內存緩存區中,如果文件內容超過了 DiskFileItemFactory 指定的緩沖區的大小, //那么文件將被保存到磁盤上,存儲為 DiskFileItemFactory 指定目錄中的臨時文件。 //等文件數據都接收完畢后,ServletUpload再從文件中將數據寫入到上傳文件目錄下的文件中 ServletFileUpload upload = new ServletFileUpload(factory); // maximum size before a FileUploadException will be thrown upload.setSizeMax(1000000 * 20); /**********解析表單傳遞過來的數據,返回List集合數據-類型:FileItem***********/ try { List fileItems = upload.parseRequest(request); String itemNo = ""; //Iterator iter = fileItems.iterator()取其迭代器 //iter.hasNext()檢查序列中是否還有元素 for (Iterator iter = fileItems.iterator(); iter.hasNext();) { //獲得序列中的下一個元素 FileItem item = (FileItem) iter.next(); //判斷是文件還是文本信息 //是普通的表單輸入域 if(item.isFormField()) { if ("itemNo".equals(item.getFieldName())) { itemNo = item.getString(); } } //是否為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()); // 保存文件在服務器的物理磁盤中:第一個參數是:完整路徑(不包括文件名)第二個參數是:文件名稱 //item.write(file); //修改文件名和物料名一致,且強行修改了文件擴展名為gif //item.write(new File(uploadPath, itemNo + ".gif")); //將文件保存到目錄下,不修改文件名 item.write(new File(uploadPath, fileName)); //將圖片文件名寫入打數據庫 itemManager.uploadItemImage(itemNo, fileName); } } response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet"); } catch (Exception e) { e.printStackTrace(); throw new ApplicationException("上傳失??!"); } } }
該類繼承了AbstractItemServlet: 所有物料Servlet的抽象父類,負責實例化ItemManager
/** * 所有物料Servlet的抽象父類,負責實例化ItemManager * @author LiMin * */ public abstract class AbstractItemServlet extends HttpServlet { //雖然不是線程安全的,但是如果只讀的話,是不會有錯誤的 protected ItemManager itemManager = null; @Override public void init() throws ServletException { itemManager = new ItemManagerImpl() } }
ItemManagerImpl是實現了ItemManager接口的子類。這種設計模式有一個問題,有待遇優化,但這里為了說明圖片上傳,不多做無關的贅述。
總結:
關于init()初始化方法:
在Servlet初始化的時候,就動態創建目錄,這里是把一個upload和臨時文件tempPath創建到了tomcat的webapps下的項目的跟目錄中。
值得注意點是這里需要顯示調用super.init()方法(super不是父類對象的引用,但是負責父類的方法的調用),否則,可能會造成該類的空指針。
上傳大致分三步執行:使用 FileUpload 組件解析表單;解析表單傳遞過來的數據,返回List集合數據-類型:FileItem;最后上傳圖片。
使用FileItem的isFormField()方法判斷是普通文本還是文件;
使用FileItem.write(new File(uploadPath, fileName))上傳文件,第一個參數是:完整路徑(不包括文件名)第二個參數是:文件名稱;
處理普通文本數據:
if ("itemNo".equals(item.getFieldName())) { itemNo = item.getString(); }
上傳是很多年比較成熟的技術,有很多已經封裝好的,我們平時的項目中可以直接拿來用,但是了解一些基本的原理是必不可少的。
以上是“java如何實現上傳圖片文件功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。