麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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;
  }
  //存貯路徑

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日本视频免费看 | 视频一区免费观看 | 日韩毛片一区二区三区 | 草久在线 | 97人操| 日本免费aaa观看 | 亚洲视频成人 | 久久亚洲精品11p | 狠狠干最新网址 | 宅男噜噜噜66国产在线观看 | 国产精选在线 | 久久经典国产视频 | 欧美三级美国一级 | 欧美亚洲黄色 | 在线成人一区二区 | 韩国一大片a毛片 | 永久免费黄色大片 | 成人免费看毛片 | 亚洲特黄妇女高潮 | 国产精品一区二区三区99 | 欧美视频一区二区三区 | 国产精品久久久久久久久久久久久久久久 | www.777含羞草 | 色柚视频网站ww色 | chinese乱子伦xxxx国语对白 | 男女羞羞在线观看 | 九九热久久免费视频 | 国产亚洲综合一区二区 | sese在线视频 | 91九色视频在线播放 | 欧美性猛交xxxxx按摩国内 | 久久不雅视频 | 久久久久久亚洲综合影院红桃 | 深夜福利视频绿巨人视频在线观看 | 日本欧美一区二区三区在线观看 | 性欧美xxxx免费岛国不卡电影 | 国产在线精品一区二区夜色 | 日韩在线激情 | 亚洲第一成网站 | 99国产精品国产免费观看 | 成人富二代短视频 |