久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

基于表單的文件上傳

 jl_oracle 2014-05-06
基于表單的文件上傳 2010-04-05 21:13:27

分類:

  1. 如果在表單中使用表單元素 <input type=“file” />,瀏覽器在解析表單時,,會自動生成一個輸入框和一個按鈕,輸入框可供用戶填寫本地文件的文件名和路徑名,,按鈕可以讓瀏覽器打開一個文件選擇框供用戶選擇文件:   
  2.   
  3.     
  4.   
  5. 當(dāng)表單需要上傳文件時,,需指定表單 enctype 的值為 multipart/form-data   
  6.   
  7. 在 form 元素的語法中,enctype 屬性指定將數(shù)據(jù)發(fā)送到服務(wù)器時瀏覽器使用的編碼類型,。    
  8.   
  9. enctype 屬性取值:   
  10.   
  11. application/x-www-form-urlencoded:表單 enctype 屬性的默認(rèn)值,。這種編碼方案使用有限的字符集,當(dāng)使用了非字母和數(shù)字時,,必須用”%HH”代替(H 代表十六進(jìn)制數(shù)字),。對于大容量的二進(jìn)制數(shù)據(jù)或包含非 ASCII 字符的文本來說,這種編碼不能滿足要求,。   
  12.   
  13. multipart/form-data:form 設(shè)定了enctype=“multipart/form-data”屬性后,,表示表單以二進(jìn)制傳輸數(shù)據(jù) .   
  14.   
  15.     
  16.   
  17. Commons-fileupload 組件上傳的基本原理   
  18.   
  19. FileUpload組件將頁面提交的所有元素(普通form表單域,,如text和文件域file)都看作一樣的FileItem,這樣上傳頁面提交的 request請求也就是一個FileItem的有序組合,,F(xiàn)ileUpload組件可以解析該request,,并返回一個一個的FileItem。而對每一個FileItem,,F(xiàn)ileUpload組件可以判斷出它是普通form表單域還是文件file域,,從而根據(jù)不同的類型,采取不同的操作--如果是表單域,,就讀出其值,,如果是文件域,就保存文件到服務(wù)器硬盤上或者內(nèi)存中   
  20.   
  21.     
  22.   
  23. Commons-fileupload 組件API   
  24.   
  25. ServletFileUpload 負(fù)責(zé)處理上傳的文件數(shù)據(jù),,并將每部分的數(shù)據(jù)封裝成一到 FileItem 對象中,。   
  26.   
  27. DiskFileItemFactory 是創(chuàng)建 FileItem 對象的工廠,在這個工廠類中可以配置內(nèi)存緩沖區(qū)大小和存放臨時文件的目錄,。   
  28.   
  29. ServletFileUpload 在接收上傳文件數(shù)據(jù)時,,會將內(nèi)容保存到內(nèi)存緩存區(qū)中,如果文件內(nèi)容超過了 DiskFileItemFactory 指定的緩沖區(qū)的大小,,那么文件將被保存到磁盤上,,存儲為 DiskFileItemFactory 指定目錄中的臨時文件。等文件數(shù)據(jù)都接收完畢后,,ServletUpload 在從文件中將數(shù)據(jù)寫入到上傳文件目錄下的文件中   
  30.   
  31.     
  32.   
  33.     
  34.   
  35. 進(jìn)行文件上傳和下載的具體操作:   
  36.   
  37. 首先,,加載必要的jar包:“commons-fileupload-1.2.1.jar”,“commons-io-1.4.jar”   
  38.   
  39. 步驟:   
  40.   
  41. 0. 創(chuàng)建 FileItemFactory 子類 DiskFileItemFactory 的對象   
  42.   
  43. 1.為了得到 ServletFileUpload 對象, 先需要得到 FileItemFactory 的一個對象, 然后調(diào)用 new ServletFileUpload(FileItemFactory fif); 方法得到 ServletFileUpload 對象   
  44.   
  45. 2.為了得到 FileItem 的集合,, 先需要得到 ServletFileUpload 對象,, 然后調(diào)用該對象的 parseRequest() 方法得到 FileItem 的 List   
  46.   
  47. 3.從 HttpServletRequest 對象中得到 FileItem 的集合   
  48.   
  49. 4. 對上述集合進(jìn)行遍歷:判斷是表單域還是文件域   
  50.   
  51.     
  52.   
  53. 下面是對文件上傳相關(guān)操作的代碼示例。   
  54.   
  55. //1. 驗證是否使用 FileUpload 組件   
  56.   
  57.         boolean isMultipart = ServletFileUpload.isMultipartContent(request);   
  58.   
  59.           
  60.   
  61.         //2.1  不使用   
  62.   
  63.         if(!isMultipart){   
  64.   
  65.             response.getWriter().println("沒有文件域");   
  66.   
  67.             return;   
  68.   
  69.         }   
  70.   
  71.           
  72.   
  73.         //2.2 使用   
  74.   
  75.           
  76.   
  77.         //3. 獲取 DiskFileItemFactory 對象   
  78.   
  79.         DiskFileItemFactory itemFactory = new DiskFileItemFactory();   
  80.   
  81.           
  82.   
  83.         //4. 獲取 ServletFileUpload 對象   
  84.   
  85.         ServletFileUpload fileUpload = new ServletFileUpload();   
  86.   
  87.         fileUpload.setFileItemFactory(itemFactory);   
  88.   
  89.         設(shè)置上傳文件的最大大小   
  90.   
  91.         fileUpload.setFileSizeMax(1000 * 100);   
  92.   
  93.           
  94.   
  95.         String forwardPage = null;   
  96.   
  97.           
  98.   
  99.         try {   
  100.   
  101.             //5. 調(diào)用 ServletFileUpload 的 parseRequest() 方法, 獲取 FileItem 的集合   
  102.   
  103.             List<FileItem> items = fileUpload.parseRequest(request);   
  104.   
  105.               
  106.   
  107.             Map<String, String> paramMap = new HashMap<String, String>();   
  108.   
  109.             FileItem fileItem = null;   
  110.   
  111.               
  112.   
  113.             //6. 對 5 獲取的集合進(jìn)行遍歷   
  114.   
  115.             Iterator<FileItem> it = items.iterator();   
  116.   
  117.             while(it.hasNext()){   
  118.   
  119.                 FileItem item = it.next();   
  120.   
  121.                 //7. 驗證是否為表單域   
  122.   
  123.                 if(item.isFormField()){   
  124.   
  125.                     //7.1 是表單域, 把獲取到得 表單域的 fieldName 和 value 放在 map 中.   
  126.   
  127.   獲得表單中該字段的字段名   
  128.   
  129.                     String fieldName = item.getFieldName();   
  130.   
  131. 獲得表單中與上面字段名對應(yīng)的字段值   
  132.   
  133.                     String value = item.getString("UTF-8");   
  134.   
  135.                       
  136.   
  137.                     paramMap.put(fieldName, value);   
  138.   
  139.                 }   
  140.   
  141.                     //7.2 不是表單域, 即為文件域. 獲取 FileItem 對象, 注意限制條件.   
  142.   
  143.                 else{   
  144.   
  145. 這里獲得了與file對應(yīng)的FileItem對象   
  146.   
  147.                     fileItem = item;   
  148.   
  149.                 }   
  150.   
  151.                       
  152.   
  153.             }   
  154.   
  155.               
  156.   
  157.             //8. 對 7.2 獲取的 FileItem 對象進(jìn)行文件上傳操作.   
  158.   
  159.             //10.1 獲取全路徑名   
  160.   
  161.             String path = null;   
  162.   
  163.               
  164.   
  165.             path = this.getServletContext().getRealPath("/photoes");   
  166.   
  167.               
  168.   
  169.             File photoesDir = new File(path);   
  170.   
  171.             if(!photoesDir.exists()){   
  172.   
  173.                 photoesDir.mkdir();   
  174.   
  175.             }   
  176.   
  177.               
  178.   
  179.             path = path + "/" + paramMap.get("username");   
  180.   
  181.               
  182.   
  183.             File file = new File(path + ".jpg");   
  184.   
  185.               
  186.   
  187.             //10.2 上傳操作,,把用戶在頁面上傳的文件保存到服務(wù)器   
  188.   
  189.             fileItem.write(file);   
  190.   
  191.     
  192.   
  193. 上傳文件表單的兩個準(zhǔn)備工作   
  194.   
  195. 1. 提交方式改為 POST   
  196.   
  197. 2. enctype 屬性的取值改為 multipart/form-data   
  198.   
  199.     
  200.   
  201. 在獲取表單值時   
  202.   
  203. 1. 不能使用 request.getParameter() 方法, 因為該方法僅能獲取字符串, 對二進(jìn)制無能為力.   
  204.   
  205. 2. 使用 fileUpload 組件讀取上傳文件及表單域字段.   
  206.   
  207.     
  208.   
  209. fileUpload 組件的核心思想   
  210.   
  211. fileUpload 組件認(rèn)為: 所有的表單域(包含文件域和文本域)都是 FileItem 對象.   
  212.   
  213. 步驟:   
  214.   
  215. 1. 獲取 FileItem 對象組成的 List   
  216.   
  217. 2. 對 List 進(jìn)行遍歷   
  218.   
  219. 3. 判斷每一個  FileItem 對象是表單域 還是 文件域, 以進(jìn)行不同的處理.   
  220.   
  221.     
  222.   
  223. 詳細(xì)步驟:   
  224.   
  225. 1. 檢查表單的 enctype 是否為 multipart/form-data, 以決定是否使用 FileUpload 組件進(jìn)行解析請求   
  226.   
  227. 2. 若表單的 enctype 是否為 multipart/form-data, 則需要獲取 封裝了所有表單域 的對應(yīng)的 FileItem 對象的 List: List<FileItem> list = null;   
  228.   
  229.    3) 獲取 ServletFileUpload 對象, 調(diào)用該對象的 public java.util.List parseRequest(javax.servlet.http.HttpServletRequest request)   
  230.   
  231.                方法獲取封裝 FileItem 的List   
  232.   
  233.    2) 需要使用 ServletFileUpload 的構(gòu)造器來創(chuàng)建 ServletFileUpload 對象:   
  234.   
  235.       ^ 使用任意一個構(gòu)造器都可以得到 ServletFileUpload 對象, 但都需要先得到 FileItemFactory 對象   
  236.   
  237.       * ServletFileUpload upload = new ServletFileUpload();   
  238.   
  239.           upload.setFileItemFactory(factory);   
  240.   
  241.         * ServletFileUpload upload = new ServletFileUpload(factory);   
  242.   
  243.    1) 創(chuàng)建 FileItemFactory 接口是想類對象: DiskFileItemFactory, 直接創(chuàng)建該對象.   
  244.   
  245. 3. 可以調(diào)用 DiskFileItemFactory 的相關(guān)方法來對文件上傳進(jìn)行一些優(yōu)化:   
  246.   
  247.    1) setSizeThreshold(int sizeThreshold):設(shè)置使用臨時文件夾的大小.   
  248.   
  249.    2) setRepository(): 設(shè)置臨時文件夾   
  250.   
  251. 4. 可以調(diào)用 ServletUpload 的方法進(jìn)行文件上傳的一些控制   
  252.   
  253.    1) setFileSizeMax: 設(shè)置單個文件的最大上傳值   
  254.   
  255.    2) setSizeMax:設(shè)置總上傳文件的最大值, 以 byte 為單位.   
  256.   
  257. 5. 關(guān)于中文亂碼的問題:   
  258.   
  259.    1) 在解析 request 之前: request.setCharacterEncoding("UTF-8"); 可以解決文件域的亂碼問題   
  260.   
  261.    2) 在解析表單域時需要使用: new String(value.getBytes("iso-8859-1"), "UTF-8"); 解決中文亂碼問題.   
  262.   
  263. 但是有時候,,即使我們按照上面方式設(shè)置了,可以還是中文亂碼,,這個時候問題多半就出在tomcat的配置上了,,打開tomcat的service.xml文件,在那里面注意下面部分   
  264.   
  265.  <Connector port="8989" protocol="HTTP/1.1"  
  266.   
  267.                connectionTimeout="20000"  
  268.   
  269.                redirectPort="8443" useBodyEncodingForURI="true"/>   
  270.   
  271. 只有加上了紅色部分的設(shè)置,,我們在程序中配置EncodingUrl才能起作用,。   
  272.   
  273.     
  274.   
  275. 下面一段代碼是文件下載的相關(guān)操作   
  276.   
  277. //1. 設(shè)置響應(yīng)報頭 contentType: application/x-msdownload -->   
  278.   
  279.         //   告訴瀏覽器其所輸出的內(nèi)容的類型不是普通的文本文件或 HTML 文件,而是一個要保存到本地的下載文件   
  280.   
  281.         //response.setHeader("conent-type", "application/x-msdownload");   
  282.   
  283.         response.setContentType("application/x-msdownload");   
  284.   
  285.           
  286.   
  287.         //2. 設(shè)置響應(yīng)抱頭 Content-Disposition: attachment -->   
  288.   
  289.         //   Web 服務(wù)器希望瀏覽器不直接處理相應(yīng)的實體內(nèi)容,,而是由用戶選擇將相應(yīng)的實體內(nèi)容保存到一個文件中   
  290.   
  291.         response.setHeader("Content-Disposition""attachment; filename=haha.ppt");   
  292.   
  293.           
  294.   
  295.         //3. 利用 response.getOutputStream() 進(jìn)行 io 操作   
  296.   
  297.         OutputStream os = response.getOutputStream();   
  298.   
  299.         BufferedOutputStream bos = new BufferedOutputStream(os);   
  300.   
  301.           
  302.   
  303.         //文件的輸入流   
  304.   
  305.         InputStream is = null;   
  306.   
  307.         is = new FileInputStream("E:\\source\\090515\\javaee\\fileupload\\fileUpload.ppt");   
  308.   
  309.         BufferedInputStream bis = new BufferedInputStream(is);   
  310.   
  311.           
  312.   
  313.         int length = 0;   
  314.   
  315.         byte [] temp = new byte[1 * 1024 * 10];   
  316.   
  317.         while((length = bis.read(temp)) != -1){   
  318.   
  319.             bos.write(temp, 0, length);   
  320.   
  321.             System.out.println("循環(huán)操作中...");   
  322.   
  323.         }   
  324.   
  325.           
  326.   
  327.         bis.close();   
  328.   
  329.         bos.close();   
  330.   
  331.     
  332.   
  333. 但是上面的這種方式無法被迅雷之類的下載工具下載,,如果希望被迅雷之類的東西下載,就直接這么寫就可以了   
  334.   
  335. request.getRequestDispatcher("/data/fileUpload.ppt")   
  336.   
  337.             .forward(request, response);  

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多