最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能

 更新時(shí)間:2018年01月08日 11:12:57   作者:lmdcszh  
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)java上傳圖片文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

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

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

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

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

1、前端使用file標(biāo)簽:

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

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

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

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

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

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

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 { 
  //在系統(tǒng)啟動(dòng)的時(shí)候,就開始初始化,在初始化時(shí),檢查上傳圖片的文件夾和存放臨時(shí)文件的文件夾是否存在,如果不存在,就創(chuàng)建  
   
  //獲取根目錄對(duì)應(yīng)的真實(shí)物理路徑 
  uploadPath = new File(getServletContext().getRealPath("upload")); 
  System.out.println("uploadPath=====" + uploadPath); 
  //如果目錄不存在 
  if (!uploadPath.exists()) { 
   //創(chuàng)建目錄 
   uploadPath.mkdir(); 
  } 
   
  //臨時(shí)目錄 
  //File tempFile = new File(item.getName())構(gòu)造臨時(shí)對(duì)象 
  tempPath = new File(getServletContext().getRealPath("temp")); 
  if (!tempPath.exists()) { 
   tempPath.mkdir(); 
  } 
   
  //如果不顯示調(diào)用父類方法,就不會(huì)有itemManager實(shí)例,因此會(huì)造成空指針 
  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中拿取數(shù)據(jù),因?yàn)樯蟼黜?yè)的編碼格式跟一般的不同,使用的是enctype="multipart/form-data" 
  //form提交采用multipart/form-data,無法采用req.getParameter()取得數(shù)據(jù) 
  //String itemNo = req.getParameter("itemNo"); 
  //System.out.println("itemNo======" + itemNo); 
    
   
 /********************************使用 FileUpload 組件解析表單********************/ 
   
  //DiskFileItemFactory:創(chuàng)建 FileItem 對(duì)象的工廠,在這個(gè)工廠類中可以配置內(nèi)存緩沖區(qū)大小和存放臨時(shí)文件的目錄。 
  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:負(fù)責(zé)處理上傳的文件數(shù)據(jù),并將每部分的數(shù)據(jù)封裝成一到 FileItem 對(duì)象中。 
  //在接收上傳文件數(shù)據(jù)時(shí),會(huì)將內(nèi)容保存到內(nèi)存緩存區(qū)中,如果文件內(nèi)容超過了 DiskFileItemFactory 指定的緩沖區(qū)的大小, 
  //那么文件將被保存到磁盤上,存儲(chǔ)為 DiskFileItemFactory 指定目錄中的臨時(shí)文件。 
  //等文件數(shù)據(jù)都接收完畢后,ServletUpload再?gòu)奈募袑?shù)據(jù)寫入到上傳文件目錄下的文件中 
    
  ServletFileUpload upload = new ServletFileUpload(factory); 
  // maximum size before a FileUploadException will be thrown 
  upload.setSizeMax(1000000 * 20); 
   
   
  /**********解析表單傳遞過來的數(shù)據(jù),返回List集合數(shù)據(jù)-類型:FileItem***********/ 
   
  try { 
    
   List fileItems = upload.parseRequest(request); 
    
   String itemNo = ""; 
   //Iterator iter = fileItems.iterator()取其迭代器 
   //iter.hasNext()檢查序列中是否還有元素 
   for (Iterator iter = fileItems.iterator(); iter.hasNext();) { 
    //獲得序列中的下一個(gè)元素 
    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()); 
      
      // 保存文件在服務(wù)器的物理磁盤中:第一個(gè)參數(shù)是:完整路徑(不包括文件名)第二個(gè)參數(shù)是:文件名稱  
     //item.write(file); 
     //修改文件名和物料名一致,且強(qiáng)行修改了文件擴(kuò)展名為gif 
     //item.write(new File(uploadPath, itemNo + ".gif")); 
     //將文件保存到目錄下,不修改文件名 
     item.write(new File(uploadPath, fileName)); 
      
      
      
     //將圖片文件名寫入打數(shù)據(jù)庫(kù)     
     itemManager.uploadItemImage(itemNo, fileName); 
      
    } 
   } 
   response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet"); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   throw new ApplicationException("上傳失?。?); 
  }  
   
   
 } 
  
 
} 

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

/** 
 * 所有物料Servlet的抽象父類,負(fù)責(zé)實(shí)例化ItemManager 
 * @author LiMin 
 * 
 */ 
public abstract class AbstractItemServlet extends HttpServlet { 
 
 //雖然不是線程安全的,但是如果只讀的話,是不會(huì)有錯(cuò)誤的 
 protected ItemManager itemManager = null; 
   
 @Override 
 public void init() throws ServletException { 
  itemManager = new ItemManagerImpl() 
 } 
  
 
} 

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

總結(jié):

        關(guān)于init()初始化方法:
        在Servlet初始化的時(shí)候,就動(dòng)態(tài)創(chuàng)建目錄,這里是把一個(gè)upload和臨時(shí)文件tempPath創(chuàng)建到了tomcat的webapps下的項(xiàng)目的跟目錄中。
        值得注意點(diǎn)是這里需要顯示調(diào)用super.init()方法(super不是父類對(duì)象的引用,但是負(fù)責(zé)父類的方法的調(diào)用),否則,可能會(huì)造成該類的空指針。
        上傳大致分三步執(zhí)行:使用 FileUpload 組件解析表單;解析表單傳遞過來的數(shù)據(jù),返回List集合數(shù)據(jù)-類型:FileItem;最后上傳圖片。
        使用FileItem的isFormField()方法判斷是普通文本還是文件;
        使用FileItem.write(new File(uploadPath, fileName))上傳文件,第一個(gè)參數(shù)是:完整路徑(不包括文件名)第二個(gè)參數(shù)是:文件名稱;

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

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


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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker

    SWT(JFace)小制作 BugTracker
    2009-06-06
  • 淺談Spring6中的反射機(jī)制

    淺談Spring6中的反射機(jī)制

    Java反射機(jī)制是Java語(yǔ)言中一種動(dòng)態(tài)(運(yùn)行時(shí))訪問、檢測(cè)、修改它本身的能力,主要作用是動(dòng)態(tài)(運(yùn)行時(shí))獲取類的完整結(jié)構(gòu)信息、調(diào)用對(duì)象的方法,需要的朋友可以參考下
    2023-05-05
  • Eclipse查看開發(fā)包jar里源代碼的方法

    Eclipse查看開發(fā)包jar里源代碼的方法

    這篇文章主要介紹了Eclipse查看開發(fā)包jar里源代碼的方法的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • rocketmq client 日志的問題處理方式

    rocketmq client 日志的問題處理方式

    這篇文章主要介紹了rocketmq client 日志的問題處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 解決@JsonIgnore的使用以及自己踩坑

    解決@JsonIgnore的使用以及自己踩坑

    這篇文章主要介紹了解決@JsonIgnore的使用以及自己踩坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringSecurity OAuth2單點(diǎn)登錄和登出的實(shí)現(xiàn)

    SpringSecurity OAuth2單點(diǎn)登錄和登出的實(shí)現(xiàn)

    本文主要介紹了SpringSecurity OAuth2單點(diǎn)登錄和登出的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 解決IDEA創(chuàng)建SpringBoot項(xiàng)目沒有Java版本8問題

    解決IDEA創(chuàng)建SpringBoot項(xiàng)目沒有Java版本8問題

    這篇文章主要介紹了解決IDEA創(chuàng)建SpringBoot項(xiàng)目沒有Java版本8問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java 中synchronize函數(shù)的實(shí)例詳解

    Java 中synchronize函數(shù)的實(shí)例詳解

    這篇文章主要介紹了Java 中synchronize函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家理解使用synchronize函數(shù)的使用方法,需要的朋友可以參考下
    2017-09-09
  • SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式

    SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式

    這篇文章主要介紹了SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法

    Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法

    今天小編就為大家分享一篇關(guān)于Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論

柏乡县| 潞城市| 宣武区| 诸暨市| 驻马店市| 犍为县| 含山县| 台湾省| 琼结县| 方正县| 翁牛特旗| 那坡县| 彭州市| 诏安县| 广丰县| 栾城县| 巴东县| 乌审旗| 阳信县| 留坝县| 白城市| 邵阳市| 庆阳市| 武鸣县| 峨眉山市| 东丰县| 沁源县| 库车县| 玉林市| 永寿县| 乌兰浩特市| 思茅市| 同心县| 台安县| 行唐县| 当雄县| 濉溪县| 仙游县| 嘉祥县| 汝州市| 定陶县|