包含java通過commons的詞條

本文目錄一覽:

java怎麼用commons-fileupload實現上傳文件

文件上傳步驟:

     1. 導入jar包

          common-fileupload.jar

          common-io.jar      

     2. 上傳jsp頁面編輯

         body

            form action=”${pageContext.request.contextPath}/servlet/UploadHandleServlet” enctype=”multipart/form-data” method=”post”

                上傳用戶:input type=”text” name=”username”br/

                上傳文件1:input type=”file” name=”file1″br/

                上傳文件2:input type=”file” name=”file2″br/

                            input type=”submit” value=”提交”

            /form

        /body    

     3. 消息提示頁面(成功or失敗)     

            body

                ${message}

            /body    

     4. 處理文件上傳的servlet編寫   

         import java.io.File;

         import java.io.FileOutputStream;

         import java.io.IOException;

         import java.io.InputStream;

         import java.util.List;

         import java.util.UUID;

             

             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.FileUploadBase;

             import org.apache.commons.fileupload.ProgressListener;

             import org.apache.commons.fileupload.disk.DiskFileItemFactory;

             import org.apache.commons.fileupload.servlet.ServletFileUpload;

              

             public class UploadHandleServlet extends HttpServlet {

              

              public void doGet(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

                 //得到上傳文件的保存目錄,將上傳的文件存放於WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全

                 String savePath = this.getServletContext().getRealPath(“/WEB-INF/upload”);

                 //上傳時生成的臨時文件保存目錄

                 String tempPath = this.getServletContext().getRealPath(“/WEB-INF/temp”);

                 File tmpFile = new File(tempPath);

                 if (!tmpFile.exists()) {

                  //創建臨時目錄

                  tmpFile.mkdir();

                 }

                  

                 //消息提示

                 String message = “”;

                 try{

                  //使用Apache文件上傳組件處理文件上傳步驟:

                  //1、創建一個DiskFileItemFactory工廠

                  DiskFileItemFactory factory = new DiskFileItemFactory();

                  //設置工廠的緩衝區的大小,當上傳的文件大小超過緩衝區的大小時,就會生成一個臨時文件存放到指定的臨時目錄當中。

                  factory.setSizeThreshold(1024*100);//設置緩衝區的大小為100KB,如果不指定,那麼緩衝區的大小默認是10KB

                  //設置上傳時生成的臨時文件的保存目錄

                  factory.setRepository(tmpFile);

                  //2、創建一個文件上傳解析器

                  ServletFileUpload upload = new ServletFileUpload(factory);

                  //監聽文件上傳進度

                  upload.setProgressListener(new ProgressListener(){

                   public void update(long pBytesRead, long pContentLength, int arg2) {

                    System.out.println(“文件大小為:” + pContentLength + “,當前已處理:” + pBytesRead);

                    /**

                    * 文件大小為:14608,當前已處理:4096

                     文件大小為:14608,當前已處理:7367

                     文件大小為:14608,當前已處理:11419

                     文件大小為:14608,當前已處理:14608

                    */

                   }

                  });

                  //解決上傳文件名的中文亂碼

                  upload.setHeaderEncoding(“UTF-8”); 

                  //3、判斷提交上來的數據是否是上傳表單的數據

                  if(!ServletFileUpload.isMultipartContent(request)){

                   //按照傳統方式獲取數據

                   return;

                  }

                   

                  //設置上傳單個文件的大小的最大值,目前是設置為1024*1024位元組,也就是1MB

                  upload.setFileSizeMax(1024*1024);

                  //設置上傳文件總量的最大值,最大值=同時上傳的多個文件的大小的最大值的和,目前設置為10MB

                  upload.setSizeMax(1024*1024*10);

                  //4、使用ServletFileUpload解析器解析上傳數據,解析結果返回的是一個ListFileItem集合,每一個FileItem對應一個Form表單的輸入項

                  ListFileItem list = upload.parseRequest(request);

                  for(FileItem item : list){

                   //如果fileitem中封裝的是普通輸入項的數據

                   if(item.isFormField()){

                    String name = item.getFieldName();

                    //解決普通輸入項的數據的中文亂碼問題

                    String value = item.getString(“UTF-8”);

                    //value = new String(value.getBytes(“iso8859-1″),”UTF-8”);

                    System.out.println(name + “=” + value);

                   }else{//如果fileitem中封裝的是上傳文件

                    //得到上傳的文件名稱,

                    String filename = item.getName();

                    System.out.println(filename);

                    if(filename==null || filename.trim().equals(“”)){

                     continue;

                    }

                    //注意:不同的瀏覽器提交的文件名是不一樣的,有些瀏覽器提交上來的文件名是帶有路徑的,如: c:\a\b\1.txt,而有些只是單純的文件名,如:1.txt

                    //處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分

                    filename = filename.substring(filename.lastIndexOf(“\\”)+1);

                    //得到上傳文件的擴展名

                    String fileExtName = filename.substring(filename.lastIndexOf(“.”)+1);

                    //如果需要限制上傳的文件類型,那麼可以通過文件的擴展名來判斷上傳的文件類型是否合法

                    System.out.println(“上傳的文件的擴展名是:”+fileExtName);

                    //獲取item中的上傳文件的輸入流

                    InputStream in = item.getInputStream();

                    //得到文件保存的名稱

                    String saveFilename = makeFileName(filename);

                    //得到文件的保存目錄

                    String realSavePath = makePath(saveFilename, savePath);

                    //創建一個文件輸出流

                    FileOutputStream out = new FileOutputStream(realSavePath + “\\” + saveFilename);

                   //創建一個緩衝區

                    byte buffer[] = new byte[1024];

                    //判斷輸入流中的數據是否已經讀完的標識        int len = 0;

                    //循環將輸入流讀入到緩衝區當中,(len=in.read(buffer))0就表示in裏面還有數據

                    while((len=in.read(buffer))0){

                     //使用FileOutputStream輸出流將緩衝區的數據寫入到指定的目錄(savePath + “\\” + filename)當中

                     out.write(buffer, 0, len);

                    }

                    //關閉輸入流

                    in.close();

                    //關閉輸出流

                    out.close();        //刪除處理文件上傳時生成的臨時文件        //item.delete();        message = “文件上傳成功!”;

                   }

                  }

                 }catch (FileUploadBase.FileSizeLimitExceededException e) {

                  e.printStackTrace();

                  request.setAttribute(“message”, “單個文件超出最大值!!!”);

                  request.getRequestDispatcher(“/message.jsp”).forward(request, response);

                  return;

                 }catch (FileUploadBase.SizeLimitExceededException e) {

                  e.printStackTrace();

                  request.setAttribute(“message”, “上傳文件的總的大小超出限制的最大值!!!”);

                  request.getRequestDispatcher(“/message.jsp”).forward(request, response);

                  return;

                 }catch (Exception e) {

                  message= “文件上傳失敗!”;

                  e.printStackTrace();

                 }

                 request.setAttribute(“message”,message);

                 request.getRequestDispatcher(“/message.jsp”).forward(request, response);

              }

              private String makeFileName(String filename){ //2.jpg

               //為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名

               return UUID.randomUUID().toString() + “_” + filename;

              }  

             private String makePath(String filename,String savePath){

               //得到文件名的hashCode的值,得到的就是filename這個字符串對象在內存中的地址

               int hashcode = filename.hashCode();

               int dir1 = hashcode0xf; //0–15

               int dir2 = (hashcode0xf0)4; //0-15

               //構造新的保存目錄

               String dir = savePath + “\\” + dir1 + “\\” + dir2; //upload\2\3 upload\3\5

               if(!file.exists()){

                file.mkdirs();

              }

               return dir;

              }

              

              public void doPost(HttpServletRequest request, HttpServletResponse response)

                throws ServletException, IOException {

               doGet(request, response);

              }

             }

     5.編寫web.xml文件(servlet的映射配置)   

            servlet

                servlet-nameUploadHandleServlet/servlet-name

                servlet-classme.gacl.web.controller.UploadHandleServlet/servlet-class

            /servlet

             

            servlet-mapping

                servlet-nameUploadHandleServlet/servlet-name

                url-pattern/servlet/UploadHandleServlet/url-pattern

            /servlet-mapping

 

 

 註: 網上看到的,出處找不到了,望見諒!!

JAVA中commons-collections-3.2.1.jar包是幹什麼用的

1.commons-collections 包的功能

為Java標準的Collections API提供了相當好的補充。在此基礎上對其常用的數據結構操作進行了很好的封裝、抽象和補充。保證性能的同時大大簡化代碼。

2.commons-collections 包的分類:

根據集合類型,大致將此包的類歸納為9類:

Bag — 在org.apache.commons.collections包中定義的接口,它extends java.util.Collection,而它的實現類都被放在下面的bag包中。HashBag是Bag接口的一個標準實現。而BagUtils提供一組static的方法讓調用者獲取經過不同裝飾後的Bag實例.具體用法見代碼樣例

Buffer — 定義在org.apache.commons.collections包下面的接口,用於表示按一定順序除去成員對象的collection如隊列等。具體的實現類在org.apache.commons.collections.buffer 包下可以找到。最簡單直接的Buffer實現類是UnboundedFifoBuffer,提供先進先出的大小可變的隊列。而BoundedFifoBuffer則是對其大小進行了限制,是固定大小的先進先出隊列。BlockingBuffer要在多線程的環境中才能體現出它的價值,尤其是當我們需要實現某種流水線時這個BlockingBuffer很有用:每個流水線上的組件從上游的BlockingBuffer獲取數據,處理後放到下一個BlockingBuffer中依次傳遞。BlockingBuffer的核心特色通俗點說就是如果你向它要東西,而它暫時還沒有的話,你可以一直等待直至拿到為止。PriorityBuffer則提供比一般的先進先出Buffer更強的控制力:我們可以自定義Comparator給它,告訴它怎麼判定它的成員的先後順序,優先級最高的最先走。此外還有執行類型檢查的TypedBuffer、或者不可改變的UnmodifiableBuffer等等

Map — 在java.util.Map的基礎上擴展的接口和類。BidiMap,直譯就是雙向Map,可以通過key找到value,也可以通過value找到key,這在我們日常的代碼-名稱匹配的時候很方便:因為我們除了需要通過代碼找到名稱之外,往往也需要處理用戶輸入的名稱,然後獲取其代碼。需要注意的是BidiMap當中不光key不能重複,value也不可以。MultiMap,就是說一個key不在是簡單的指向一個對象,而是一組對象,add()和remove()的時候跟普通的Map無異,只是在get()時返回一個Collection,利用MultiMap,我們就可以很方便的往一個key上放數量不定的對象,也就實現了一對多。LazyMap,意思就是這個Map中的鍵/值對一開始並不存在,當被調用到時才創建。

Collection — 用也各collection之間的類型轉換。典型的是TypedCollection,它實際上的作用就是提供一個decorate方法,我們傳進去一個Collection和需要的類型甄別信息java.lang.Class,它給我們創建一個全新的強類型的Collection。(暫無樣例代碼,以後補充)

Comparator — 提供了一些Comparator的實現類(都在org.apache.commons.collections.comparators包下面)BooleanComparator – 用於排序一組Boolean對象,指明先true還是先false;ComparableComparator – 用於排序實現了java.lang.Comparable接口的對象(我們常用的Java類如String、Integer、Date、Double、File、Character等等都實現了Comparable接口);ComparatorChain – 定義一組Comparator鏈,鏈中的Comparator對象會被依次執行;FixedOrderComparator – 用於定義一個特殊的順序,對一組對象按照這樣的自定義順序進行排序;NullComparator – 讓null值也可參與比較,可以設定為先null或者後null;

ReverseComparator – 將原有的Comparator效果反轉;TransformingComparator – 將一個Comparator裝飾為具有Transformer效果的Comparator。

Predicate — 它以一個Object對象為參數,處理後返回一個boolean值,檢驗某個對象是否滿足某個條件。Commons Collections也提供了一組定義好的Predicate類供我們使用,這些類都放在org.apache.commons.collections.functors包中。當然,我們也可以自定義Predicate,只要實現這個Predicate接口即可。

Transformer — 我們有時候需要將某個對象轉換成另一個對象供另一組方法調用,而這兩類對象的類型有可能並不是出於同一個繼承體系的,或者說出了很基本的Object之外沒有共同的父類,或者我們根本不關心他們是不是有其他繼承關係,甚至就是同一個類的實例只是對我們而言無所謂,我們為了它能夠被後續的調用者有意義的識別和處理,在這樣的情形,我們就可以利用Transformer。除了基本的轉型Transformer之外,Commons Collections還提供了Transformer鏈和帶條件的Transformer,使得我們很方便的組裝出有意義的轉型邏輯。

Closure — 這一組接口和類提供一個操作對象的execute方法,為我們在處理一系列對象時可以將處理邏輯分離出來。ChainedClosure可以包裝一組Closure作為整體執行;IfClosure在創建時需要提供給它一個Predicate和兩個Closure,執行時先做Predicate判定再決定執行哪一個Closure;SwitchClosure跟SwitchTransformer類似,根據創建時傳入的Predicate組和Closure組對應執行;WhileClosure則根據創建時傳入的Predicate做判斷,如果為true則執行Closure,直到Predicate返回false;等等。

Iterator — java.util.Iterator接口定義了標準的Collection遍歷方法,但是如果不做改變的使用它,我們得到的是從頭到尾一次性的遍歷。假如我們需要循環遍歷,假如我們需要遍歷某一段,假如我們需要遍歷滿足某些條件的元素,等等等等,我們就不能完全依賴於這個Iterator的標準實現了。除非我們寧可在此基礎上在調用的代碼中多加一些判斷,不過這樣的話代碼就會顯得混亂,時間長了就容易變得難以維護。Commons Collections的這一組Iterator為我們帶來了便利。

java commons-fileupload上傳問題獲取文本框值的問題

enctype=”multipart/form-data”這樣搞了後普通request

失效,commons-fileupload.jar版本不一樣,後台寫法不不一樣

1.1以上版本建議這麼寫,一下版本自己百度

DiskFileItemFactory dff = new DiskFileItemFactory();// 創建該對象

dff.setSizeThreshold(1024000);// 指定在內存中緩存數據大小,單位為byte

ServletFileUpload sfu = new ServletFileUpload(dff);// 創建該對象

sfu.setFileSizeMax(5000000);// 指定單個上傳文件的最大尺寸(單個文件大小不超過5M)

sfu.setSizeMax(20000000);// 指定一次上傳多個文件的總尺寸(總文件大小不超過20M)

FileItemIterator fii = sfu.getItemIterator(request);// 解析request

List uploaditems = sfu.parseRequest(request);

for(int i=0;iuploaditems.size();i++){

FileItem item = (FileItem)uploaditems.get(i);

item.getString(“aaa”);//此處即為你想要的值,相當於request.getParameter(“aaa”);

}

java文件上傳用commons-fileupload設置緩存臨時文件的什麼意思,有人還說Java虛擬機分配到的內存只有1

肯定和虛擬機內存有關啊!你是用io流來讀寫數據,那麼內部肯定要為了效率使用Buffer包裝流來緩存吧,假如現在要上傳一個電影2g,你不設置緩存一次性上傳整個文件,java虛擬機內存總共就那麼大點(一般不設置只有64M)肯定要爆啊!,你平時的小Demo都只有幾kb肯定不用緩存也行啦!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/253362.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 02:16
下一篇 2024-12-14 02:16

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論