亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

通用上載組件的原理及實現

2019-11-18 13:17:29
字體:
來源:轉載
供稿:網友

  jsp/SERVLET上載的難點
  1、支持任意格式、任意數量的文件上載;2、上載控制的實現;3、表單信息的取得;4、“即插即用”的應用方法;我個人認為,制約通用 上載組件的實現主要是這四個難點。
  
  JSP/SERVLET上傳的原理
  JSP/SERVLET文件 上載是通過ServletInputStream類來實現的,ServletInputStream類是java.io.InputStream的一個擴展抽象類,實質上也是一個輸入流,通過ReadLine方法從Request端一行一行讀取,可見,JSP/SERVLET上載根本上是用流來實現的,理解了這個就不難理解整個 上載的原理。ServletInputStream實現文件 上載必須采用HTTP POST或者HTTP PUT協議,HTTP GET協議只能傳遞很少的數據,是不能實現文件上載的。
  
  下面我們來看一下上傳的數據流的結構,首先要在BROWSER端給出一個請求,我們的請求如下(文件名為test1.jsp):
  <%@ page contentType="text/Html; charset=GBK" %>
  <html>
  <head>
  
  <title>文件上載</title>
  </head>
  <body>
  <form action="test2.jsp" enctype="MULTIPART/FORM-DATA" method=post>
  說明一: <input type="text" name="eXPlain1" />
  <br />
  說明二: <input type="text" name="explain2" />
  <br />
  請選擇上載文件1 <input type="file" name="file1" />
  <br />
  請選擇上載文件2 <input type="file" name="file2" />
  <br />
  說明三: <input type="text" name="explain3" />
  <br />
  <input type="submit" value=" 上 載 " />
  </form>
  </body>
  </html>
  顯示如下:
  
  說明一:
  
  說明二:
  
  請選擇上載文件一:
  
  請選擇上載文件二:
  
  說明三:
  
  在上載請求頁中混雜了表單的三個輸入框,及兩個上載文件,當然輸入框可以更多、更雜,可以有選擇框、單選及多選按鈕,待上傳的文件也可以有三個、四個或所需要的更多。
  
  action="test2.jsp"表示表單將提交到"test2.jsp",另外注重表單屬性中必須要有這句:enctype="MULT  
  響應端“test2.jsp”頁面如下:
  
  <%@ page contentType="text/html; charset=GBK" %>
  <html>
  <head>
  <title>文件上載</title>
  </head>
  <body>
  <jsp:useBean id="upBean" scope="page" class="com.upload.UpBean"/>
  <%
  upBean.doUpload(request);
  out.
  %>
  </body>
  </html>
  
  test2.jsp收到請求后,調用一個java bean執行doUpload(request)操作,本操作將完成流(unicode格式)的接收并不做任何處理地將流順序寫入一個文本文件里,讀寫操作中用了一個緩沖區byte[] readByte,用了一個ServletInputStream 的一個方法readLine(byte[] b, int off,int len)方法讀取流,請大家注重,ServletInputStream 流的read Line方法是一次讀入指定大小的行,java bean (UpBean.java)代碼如下:
  
  [code]package com.upload;
  
  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.ServletInputStream;
  
  public class UpBean {
  
  public void doUpload(HttpServletRequest req) throws ServletException, IOExcept
  ion{
  //首先定義一個文本文件
  File file = new File("out.txt");
  //readCount 記錄從輸入流中實際讀取的字符數
  int readCount;
  //輸入流緩沖區
  byte[] readByte = new byte[1024];
  //初始化輸入流
  ServletInputStream servletInputStream = req.getInputStream();
  //初始化一個輸出流(到文件)
  FileOutputStream fileOutputStream = new FileOutputStream(file);
  //循環從讀取輸入流中讀取字節
  readCount = servletInputStream.readLine(readByte, 0,readByte.length);
  
  while(readCount != -1){
  fileOutputStream.write(readByte,0,readCount);
  readCount = servletInputStream.readLine(readByte, 0, 1024);
  }
  //關閉文件流
  fileOutputStream.flush();
  }
  }[/code]
  
  為了便于我們閱讀流,上載的兩個文件為兩個簡單的文本文件(有格式的文件,不便于直接分析):one.txt及two.txt,文件內容如下,實驗時請建立對應文本文件,內容請直接copy以下所示:
  
  one.txt:
  
  one
  one one
  one one one
  
     two.txt
  two
  two two
  two two two
  
  都預備好以后,我們就可以運行了,運行時請注重,文本部分及文件部分最好不要出現漢字,或其他雙字符集字符,盡量采用英文,因為接收是采用的Unicode字符集,我們未對輸入做任何處理。 我們在三個輸入框輸入的字符為,說明一:explain1;說明二:explain2;說明三:explain3,out.txt接收到如下字符:
  
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="explain1"
  
  explain1
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="explain2"
  
  explain2
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="file1"; filename="C:/test/one.txt"
  Content-Type: text/plain
  
  one
  
  one one
  one one one
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="file2"; filename="C:/test/two.txt"
  Content-Type: text/plain
  
  two
  two two
  two two two
  -----------------------------7d2623a3e0286
  Content-Disposition: form-data; name="explain3"
  
  explain3
  -----------------------------7d2623a3e0286--
  可以很明顯的看到,out.txt被“-----------------------------7d2623a3e0286”分成了五 節,即表單的每個輸入部分都對應一節,結尾部分是“-----------------------------7d2623a3e0286--”,剛好比開始的一段字符在最后多出兩個“-”, 每節的第一行是輸入內容的說明“Content-Disposition: form-data”,“name="explain1"”表示 上載請求項的name,文本輸入部分僅這兩個說明,假如輸入的是文件還用兩項說明:“filename="C:/test/one.txt"”,表示輸入源,基于ms-windows的ie上載帶有完整的路徑,netscape及其他瀏覽器可能只有一個文件名;還有一項是關于輸入格式的“Content-Type:text/plain”;表示輸入格式是文本類型,假如我們上載的是bmp文件則為“Content-Type: image/bmp”,
Word文件為“application/msword”...,說明的下面緊接著是一個空行,然后下面才是我們所需的內容。
  
  仔細分析未加修改的輸入流格式,有助于我們實現文件與輸入文本的準確分離。
  通過以上的分析可以看出,準確分離上載的文件及文本信息需要以下要素:1、數據段分割符、結束符(比分割符多出兩個“-”);2、輸入文本及上載的文件區分標志(文本為“name=”,文件為“filename=”);3、編碼格式,可以通過HttpServletRequest 類getCharacterEncoding() 方法取得。4、表單文本部分名稱及內容,名稱為“name=”后面的字符,內容為該段第三行及以后的內容;5、文件名稱及內容,名稱為“filename=”后面的字符,內容為該段第三行及以后的內容。
  
  下面我們將討論輸入流的分離。
  
  程序實現分析
  我們首先畫出程序實現的主體結構圖,請注重判定文件標志(indexOf("filename=")>0),與判定文本標志(indexOf("name=")>0)的順序,當(indexOf("filename=")>0)成立時,(indexOf("name=")>0)一定也是成立的,所以判定文件要在判定文本前。
  
  分離文件及輸入文本,為完整保存上載的文件信息及輸入的文本信息,本程序建立了兩個類:public class FileInfo 、public class InputField,及兩個線性表private ArrayList upFilesList、private ArrayList inputFieldList,用于動態增加文件信息及文本信息,定義如下:
  
  FileInfo.java(記錄上載文件信息)
  
  package com.upload;
  
  public class FileInfo {
  private String fileName;
  private boolean validFlag;
  private String filePath;
  private long fileSize;
  
  //設置文件信息
  //上載文件是否有效標志
  public void setValidFlag(boolean validFlag){
  
  this.validFlag = validFlag;
  }
  //文件名
  public void setFileName(String filename){
  this.fileName = filename;
  }
  //存貯路徑

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲另类xxxx| 91牛牛免费视频| 欧美成人亚洲成人| 中文字幕亚洲综合久久| 亚洲福利视频在线| 欧美成人一区在线| 91精品国产91久久久久久不卡| www.99久久热国产日韩欧美.com| 美日韩丰满少妇在线观看| 久久久久亚洲精品成人网小说| 91在线中文字幕| 亚洲免费高清视频| 亚洲欧美国产一区二区三区| 色综合视频网站| 日韩视频免费在线| 欧美一区二区三区……| 午夜精品美女自拍福到在线| 国产精品jizz在线观看麻豆| 日韩美女视频在线观看| 日韩视频免费大全中文字幕| 亚洲精品美女网站| 日韩av一区二区在线| 午夜精品蜜臀一区二区三区免费| 欧美日韩激情视频8区| 成人美女av在线直播| 亚洲成avwww人| 国产精品白嫩美女在线观看| 久久久久久有精品国产| 欧美做受高潮电影o| 亚洲欧美激情一区| 亚洲日本中文字幕| 国产91精品青草社区| 日韩欧美视频一区二区三区| 欧美成人亚洲成人日韩成人| 精品亚洲一区二区三区在线观看| 亚洲成**性毛茸茸| 亚洲国产精品va在线观看黑人| 欧美国产日本高清在线| 亚洲韩国日本中文字幕| 亚洲日本中文字幕免费在线不卡| 日本免费一区二区三区视频观看| 韩国国内大量揄拍精品视频| xxx一区二区| 在线免费看av不卡| 国产成人精品视频| 日韩国产一区三区| 日韩免费av一区二区| 日本高清久久天堂| 日韩在线一区二区三区免费视频| 国产精品视频999| 久久久久久久久久久人体| 欧美丝袜一区二区三区| 最新69国产成人精品视频免费| 青青草原一区二区| 成人av.网址在线网站| 亚洲国产欧美在线成人app| 这里只有视频精品| 97国产在线观看| 亚洲天堂av图片| 日本欧美黄网站| 欧美性生交xxxxxdddd| 欧美一区二区三区免费观看| 538国产精品一区二区在线| 亚洲成av人乱码色午夜| 色综合久久88| 97在线视频观看| 日韩精品久久久久久久玫瑰园| 欧美日韩亚洲国产一区| 一道本无吗dⅴd在线播放一区| 亚洲人成网站免费播放| 欧美激情一区二区三区高清视频| 欧美一级淫片aaaaaaa视频| 91免费国产视频| 欧美视频不卡中文| 国产91精品视频在线观看| 欧美日韩福利视频| 欧美日韩在线免费| 欧美成人精品h版在线观看| 久久久精品亚洲| 777精品视频| 国产精品三级美女白浆呻吟| 亚洲日韩欧美视频| 日本成人免费在线| 欧美性极品xxxx娇小| 亚洲天堂成人在线视频| 欧美激情在线狂野欧美精品| 日韩三级影视基地| 久久久伊人欧美| 国产91在线播放九色快色| 国产在线a不卡| 在线观看国产精品91| 国产综合色香蕉精品| 欧美日韩在线免费观看| 成人淫片在线看| 亚洲成人在线视频播放| 一本色道久久88综合日韩精品| 日韩精品免费在线视频观看| 欧美日韩国产va另类| 一本色道久久88综合日韩精品| 欧美黑人巨大精品一区二区| 97在线免费视频| 日本亚洲欧洲色α| 久久福利视频网| 1769国产精品| 日韩免费电影在线观看| 成人午夜在线影院| 国产精品7m视频| 国产精品久久久久久久久粉嫩av| 久久亚洲精品国产亚洲老地址| 亚洲深夜福利网站| 高跟丝袜一区二区三区| 欧美大片在线看免费观看| 欧美日韩在线一区| 91po在线观看91精品国产性色| 中文字幕亚洲欧美日韩高清| 国产精品91久久久| 欧美激情免费观看| 国产成人在线精品| 久热99视频在线观看| 91精品在线观| 国产亚洲福利一区| 国产一级揄自揄精品视频| 成人福利在线视频| 欧美主播福利视频| 精品久久久久久中文字幕| 国产va免费精品高清在线| 狠狠色狠色综合曰曰| 国产成人一区三区| 国产亚洲欧美另类中文| 91高清免费视频| 欧美美最猛性xxxxxx| 亚洲人精选亚洲人成在线| 国产成人精品免费视频| 久热精品视频在线观看| 不卡伊人av在线播放| 亚洲肉体裸体xxxx137| 亚洲va欧美va国产综合剧情| 久久精品欧美视频| 久久综合伊人77777尤物| 日韩一级黄色av| 久久精品亚洲国产| 久久人91精品久久久久久不卡| 91中文字幕在线| 亚洲精品久久7777777| 国产精品毛片a∨一区二区三区|国| 福利视频导航一区| 国产精品美女主播在线观看纯欲| 久久久精品国产亚洲| 欧美激情一级精品国产| 宅男66日本亚洲欧美视频| 神马国产精品影院av| www日韩中文字幕在线看| 亚洲欧洲日产国码av系列天堂| 性欧美视频videos6一9| 在线精品国产欧美| 日韩av网址在线观看| 欧美日韩在线视频一区二区| 欧美在线观看www| 成人伊人精品色xxxx视频| 亚洲美女免费精品视频在线观看| 日韩在线视频一区| 亚洲国产精品va在线看黑人| 亚州国产精品久久久| 亚洲欧美中文字幕在线一区|