日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

java上傳圖片文件

 青_春 2016-03-18

  總的說圖片上傳有兩種方式,一種是把圖片文件寫到數(shù)據(jù)庫中,另一種是存到服務(wù)器文件目錄中。寫到數(shù)據(jù)庫中的圖片文件需要轉(zhuǎn)換成二進制流的格式,占用數(shù)據(jù)庫空間比較,適合少量圖片的存儲,比如說,系統(tǒng)中某些小圖標,寫到數(shù)據(jù)庫中的優(yōu)點是比較安全,不容易被用戶不小心刪除。

  如果是大量的圖片的存儲通常的做法是保存到服務(wù)器的某個文件夾中。而完成上傳有很多方式,可以采用流的方式,可以采用ftp的方式,這里采用fileupload方式。

  隨著系統(tǒng)規(guī)模的不同,對圖片文件的處理方式也不盡相同。如果系統(tǒng)中圖片的數(shù)量不是很大,直接把所有的圖片存儲到同一個目錄下即可。如果圖片的積累比較多,可以根據(jù)物資分類對圖片進行相應(yīng)的分類儲存,這樣會節(jié)省一些在磁盤中查找文件的時間。

 圖片上傳到文件中,可以直接上傳圖片到目錄中,也還可以將圖片文件名、文件路徑寫入到數(shù)據(jù)庫中,也可以在程序中動態(tài)的創(chuàng)建文件路徑。如果公司中要求圖片要用專門的服務(wù)器存放,這時候把文件路徑寫活還是比較合適的。一般的如果一種物資(物料)對應(yīng)一張圖片是比較容易處理的。如果對應(yīng)多張圖片,處理起來就需要配合循環(huán)使用。一方面,需要處理圖片的動態(tài)顯示,另一方面要檢查圖片文件命名是否重復(fù)。另外再圖片處理(上傳、刪除、修改)的時候需要配合事務(wù)。

  下面重點介紹一下使用fileupload方式實現(xiàn)圖片上傳的最基本的實現(xiàn)。

1、前端使用file標簽:

  1. <input name = "fileName" type ="file" class ="text1" size ="40" maxlength="40">  

2、設(shè)置文件的enctype格式:multipart/form-data

  1. <form name="itemForm"  target="_self" id="itemForm" method="post"  action="servlet/item/FileUploadServlet" enctype="multipart/form-data" >  

關(guān)于enctype="multipart/form-data" 的說明:

在jsp中使用了該格式,對應(yīng)的Servlet就不能使用request.getParameter()取得參數(shù),要使用ServletFileUpload對象的parseRequest方法先把request對象中的數(shù)據(jù)解析,然后,使用解析出的元素的isFormField標志,配合getFieldName方法來獲取數(shù)據(jù)。

3、FileUploadServlet的實現(xiàn):

  1. package com.bjpowernode.drp.basedata.web;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.Iterator;  
  6. import java.util.List;  
  7.   
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.apache.commons.fileupload.FileItem;  
  14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  15. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  16.   
  17. import com.bjpowernode.drp.basedata.manager.ItemManager;  
  18. import com.bjpowernode.drp.basedata.manager.ItemManagerImpl;  
  19. import com.bjpowernode.drp.util.ApplicationException;  
  20.   
  21. public class FileUploadServlet extends AbstractItemServlet {  
  22.       
  23.       
  24.     private File uploadPath;  
  25.       
  26.       
  27.     private File tempPath;  
  28.       
  29.   
  30.       
  31.     @Override  
  32.     public void init() throws ServletException {  
  33.         //在系統(tǒng)啟動的時候,就開始初始化,在初始化時,檢查上傳圖片的文件夾和存放臨時文件的文件夾是否存在,如果不存在,就創(chuàng)建       
  34.           
  35.         //獲取根目錄對應(yīng)的真實物理路徑  
  36.         uploadPath = new File(getServletContext().getRealPath("upload"));  
  37.         System.out.println("uploadPath=====" + uploadPath);  
  38.         //如果目錄不存在  
  39.         if (!uploadPath.exists()) {  
  40.             //創(chuàng)建目錄  
  41.             uploadPath.mkdir();  
  42.         }  
  43.           
  44.         //臨時目錄  
  45.         //File tempFile = new File(item.getName())構(gòu)造臨時對象  
  46.         tempPath = new File(getServletContext().getRealPath("temp"));  
  47.         if (!tempPath.exists()) {  
  48.             tempPath.mkdir();  
  49.         }  
  50.           
  51.         //如果不顯示調(diào)用父類方法,就不會有itemManager實例,因此會造成空指針  
  52.         super.init();  
  53.           
  54.           
  55.       
  56.     }  
  57.       
  58.   
  59.   
  60.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  61.             throws ServletException, IOException {  
  62.   
  63.             doPost(request,response);  
  64.     }  
  65.   
  66.       
  67.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  68.             throws ServletException, IOException {  
  69.               
  70.         //從item_upload.jsp中拿取數(shù)據(jù),因為上傳頁的編碼格式跟一般的不同,使用的是enctype="multipart/form-data"  
  71.         //form提交采用multipart/form-data,無法采用req.getParameter()取得數(shù)據(jù)  
  72.         //String itemNo = req.getParameter("itemNo");  
  73.         //System.out.println("itemNo======" + itemNo);  
  74.               
  75.           
  76.     /********************************使用 FileUpload 組件解析表單********************/  
  77.           
  78.         //DiskFileItemFactory:創(chuàng)建 FileItem 對象的工廠,在這個工廠類中可以配置內(nèi)存緩沖區(qū)大小和存放臨時文件的目錄。  
  79.         DiskFileItemFactory factory = new DiskFileItemFactory();  
  80.         // maximum size that will be stored in memory  
  81.         factory.setSizeThreshold(4096);  
  82.         // the location for saving data that is larger than getSizeThreshold()  
  83.         factory.setRepository(tempPath);  
  84.           
  85.           
  86.           
  87.         //ServletFileUpload:負責(zé)處理上傳的文件數(shù)據(jù),并將每部分的數(shù)據(jù)封裝成一到 FileItem 對象中。  
  88.         //在接收上傳文件數(shù)據(jù)時,會將內(nèi)容保存到內(nèi)存緩存區(qū)中,如果文件內(nèi)容超過了 DiskFileItemFactory 指定的緩沖區(qū)的大小,  
  89.         //那么文件將被保存到磁盤上,存儲為 DiskFileItemFactory 指定目錄中的臨時文件。  
  90.         //等文件數(shù)據(jù)都接收完畢后,ServletUpload再從文件中將數(shù)據(jù)寫入到上傳文件目錄下的文件中  
  91.           
  92.           
  93.         ServletFileUpload upload = new ServletFileUpload(factory);  
  94.         // maximum size before a FileUploadException will be thrown  
  95.         upload.setSizeMax(1000000 * 20);  
  96.           
  97.           
  98.         /*******************************解析表單傳遞過來的數(shù)據(jù),返回List集合數(shù)據(jù)-類型:FileItem***********/  
  99.           
  100.         try {  
  101.               
  102.             List fileItems = upload.parseRequest(request);  
  103.               
  104.             String itemNo = "";  
  105.             //Iterator iter = fileItems.iterator()取其迭代器  
  106.             //iter.hasNext()檢查序列中是否還有元素  
  107.             for (Iterator iter = fileItems.iterator(); iter.hasNext();) {  
  108.                 //獲得序列中的下一個元素  
  109.                 FileItem item = (FileItem) iter.next();  
  110.                   
  111.               
  112.                 //判斷是文件還是文本信息  
  113.                 //是普通的表單輸入域  
  114.                 if(item.isFormField()) {  
  115.                     if ("itemNo".equals(item.getFieldName())) {  
  116.                         itemNo = item.getString();  
  117.                     }  
  118.                 }  
  119.                 //是否為input="type"輸入域  
  120.                 if (!item.isFormField()) {                    
  121.                     //上傳文件的名稱和完整路徑  
  122.                     String fileName = item.getName();  
  123.                       
  124.                     long size = item.getSize();  
  125.                     //判斷是否選擇了文件  
  126.                     if ((fileName == null || fileName.equals("")) && size == 0) {  
  127.                         continue;  
  128.                     }  
  129.                     //截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG  
  130.                     fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());  
  131.                       
  132.                      // 保存文件在服務(wù)器的物理磁盤中:第一個參數(shù)是:完整路徑(不包括文件名)第二個參數(shù)是:文件名稱     
  133.                     //item.write(file);  
  134.                     //修改文件名和物料名一致,且強行修改了文件擴展名為gif  
  135.                     //item.write(new File(uploadPath, itemNo + ".gif"));  
  136.                     //將文件保存到目錄下,不修改文件名  
  137.                     item.write(new File(uploadPath, fileName));  
  138.                       
  139.                       
  140.                       
  141.                     //將圖片文件名寫入打數(shù)據(jù)庫                    
  142.                     itemManager.uploadItemImage(itemNo, fileName);  
  143.                       
  144.                 }  
  145.             }  
  146.             response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet");  
  147.         } catch (Exception e) {  
  148.             e.printStackTrace();  
  149.             throw new ApplicationException("上傳失?。?);  
  150.         }     
  151.           
  152.           
  153.     }  
  154.       
  155.   
  156. }  


該類繼承了AbstractItemServlet: 所有物料Servlet的抽象父類,負責(zé)實例化ItemManager

  1. /** 
  2.  * 所有物料Servlet的抽象父類,負責(zé)實例化ItemManager 
  3.  * @author LiMin 
  4.  * 
  5.  */  
  6. public abstract class AbstractItemServlet extends HttpServlet {  
  7.   
  8.     //雖然不是線程安全的,但是如果只讀的話,是不會有錯誤的  
  9.     protected ItemManager itemManager = null;  
  10.           
  11.     @Override  
  12.     public void init() throws ServletException {  
  13.         itemManager = new  ItemManagerImpl()  
  14.     }  
  15.       
  16.   
  17. }  
  

  ItemManagerImpl是實現(xiàn)了ItemManager接口的子類。這種設(shè)計模式有一個問題,有待遇優(yōu)化,但這里為了說明圖片上傳,不多做無關(guān)的贅述。


總結(jié):

  關(guān)于init()初始化方法:

  在Servlet初始化的時候,就動態(tài)創(chuàng)建目錄,這里是把一個upload和臨時文件tempPath創(chuàng)建到了tomcat的webapps下的項目的跟目錄中。

  值得注意點是這里需要顯示調(diào)用super.init()方法(super不是父類對象的引用,但是負責(zé)父類的方法的調(diào)用),否則,可能會造成該類的空指針。

  上傳大致分三步執(zhí)行:使用 FileUpload 組件解析表單;解析表單傳遞過來的數(shù)據(jù),返回List集合數(shù)據(jù)-類型:FileItem;最后上傳圖片。

  使用FileItem的isFormField()方法判斷是普通文本還是文件;

  使用FileItem.write(new File(uploadPath, fileName))上傳文件,第一個參數(shù)是:完整路徑(不包括文件名)第二個參數(shù)是:文件名稱;

 處理普通文本數(shù)據(jù):

 if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
 } 

  上傳是很多年比較成熟的技術(shù),有很多已經(jīng)封裝好的,我們平時的項目中可以直接拿來用,但是了解一些基本的原理是必不可少的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多