<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            java語言

            JSP頁面如何實現文件上傳下載

            時間:2025-01-24 01:58:54 java語言 我要投稿
            • 相關推薦

            JSP頁面如何實現文件上傳下載

              Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于PC、數據中心、游戲控制臺、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發者專業社群。下面,小編為大家搜索整理了JSP頁面如何實現文件上傳下載,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

              名稱:jsp頁面上傳類

              作者:SinNeR

              Mail:vogoals[at]hotmail.com

              特點:

              可以多文件上傳;

              返回上傳后的文件名;

              form表單中的其他參數也可以得到。

              先貼上傳類,JspFileUpload

              package com.vogoal.util;

              import java.io.BufferedOutputStream;

              import java.io.File;

              import java.io.FileOutputStream;

              import java.io.IOException;

              import java.text.SimpleDateFormat;

              import java.util.ArrayList;

              import java.util.Date;

              import java.util.Hashtable;

              import javax.servlet.ServletInputStream;

              import javax.servlet.http.HttpServletRequest;

              /*

              * vogoalAPI 1.0

              * Auther SinNeR@blueidea.com

              * by vogoal.com

              * mail: vogoals@hotmail.com

              */

              /**

              * JSP上傳文件類

              *

              * @author SinNeR

              * @version 1.0

              */

              public class JspFileUpload {

              /** request對象 */

              private HttpServletRequest request = null;

              /** 上傳文件的路徑 */

              private String uploadPath = null;

              /** 每次讀取得字節的大小 */

              private static int BUFSIZE = 1024 * 8;

              /** 存儲參數的Hashtable */

              private Hashtable paramHt = new Hasptable();

              /** 存儲上傳的文件的文件名的ArrayList */

              private ArrayList updFileArr = new ArrayList();

              /**

              * 設定request對象。

              *

              * @param request

              * HttpServletRequest request對象

              */

              public void setRequest(HttpServletRequest request) {

              this.request = request;

              }

              /**

              * 設定文件上傳路徑。

              *

              * @param path

              * 用戶指定的文件的上傳路徑。

              */

              public void setUploadPath(String path) {

              this.uploadPath = path;

              }

              /**

              * 文件上傳處理主程序。

              *

              * @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3

              * 沒有設定正確的enctype;4 文件操作異常。

              */

              public int process() {

              int status = 0;

              // 文件上傳前,對request對象,上傳路徑以及enctype進行check。

              status = preCheck();

              // 出錯的時候返回錯誤代碼。

              if (status != 0)

              return status;

              try {

              // 參數或者文件名

              String name = null;

              // 參數的value

              String value = null;

              // 讀取的流是否為文件的標志位

              boolean fileFlag = false;

              // 要存儲的文件。

              File tmpFile = null;

              // 上傳的文件的名字

              String fName = null;

              FileOutputStream baos = null;

              BufferedOutputStream bos = null;

              // 存儲參數的Hashtable

              paramHt = new Hashtable();

              updFileArr = new ArrayList();

              int rtnPos = 0;

              byte[] buffs = new byte[BUFSIZE * 8];

              // 取得ContentType

              String contentType = request.getContentType();

              int index = contentType.indexOf("boundary=");

              String boundary = "--" + contentType.substring(index + 9);

              String endBoundary = boundary + "--";

              // 從request對象中取得流。

              ServletInputStream sis = request.getInputStream();

              // 讀取1行

              while ((rtnPos = sis.readLine(buffs, 0, buffs.length)) != -1) {

              String strBuff = new String(buffs, 0, rtnPos);

              // 讀取1行數據

              if (strBuff.startsWith(boundary)) {

              if (name != null && name.trim().length() > 0) {

              if (fileFlag) {

              bos.flush();

              baos.close();

              bos.close();

              baos = null;

              bos = null;

              updFileArr.add(fName);

              } else {

              Object obj = paramHt.get(name);

              ArrayList al = new ArrayList();

              if (obj != null) {

              al = (ArrayList) obj;

              }

              al.add(value);

              System.out.println(value);

              paramHt.put(name, al);

              }

              }

              name = new String();

              value = new String();

              fileFlag = false;

              fName = new String();

              rtnPos = sis.readLine(buffs, 0, buffs.length);

              if (rtnPos != -1) {

              strBuff = new String(buffs, 0, rtnPos);

              if (strBuff.toLowerCase().startsWith(

              "content-disposition: form-data; ")) {

              int nIndex = strBuff.toLowerCase().indexOf(

              "name=\"");

              int nLastIndex = strBuff.toLowerCase().indexOf(

              "\"", nIndex + 6);

              name = strBuff.substring(nIndex + 6, nLastIndex);

              }

              int fIndex = strBuff.toLowerCase().indexOf(

              "filename=\"");

              if (fIndex != -1) {

              fileFlag = true;

              int fLastIndex = strBuff.toLowerCase().indexOf(

              "\"", fIndex + 10);

              fName = strBuff.substring(fIndex + 10, fLastIndex);

              fName = getFileName(fName);

              if (fName == null || fName.trim().length() == 0) {

              fileFlag = false;

              sis.readLine(buffs, 0, buffs.length);

              sis.readLine(buffs, 0, buffs.length);

              sis.readLine(buffs, 0, buffs.length);

              continue;

              }else{

              fName = getFileNameByTime(fName);

              sis.readLine(buffs, 0, buffs.length);

              sis.readLine(buffs, 0, buffs.length);

              }

              }

              }

              } else if (strBuff.startsWith(endBoundary)) {

              if (name != null && name.trim().length() > 0) {

              if (fileFlag) {

              bos.flush();

              baos.close();

              bos.close();

              baos = null;

              bos = null;

              updFileArr.add(fName);

              } else {

              Object obj = paramHt.get(name);

              ArrayList al = new ArrayList();

              if (obj != null) {

              al = (ArrayList) obj;

              }

              al.add(value);

              paramHt.put(name, al);

              }

              }

              } else {

              if (fileFlag) {

              if (baos == null && bos == null) {

              tmpFile = new File(uploadPath + fName);

              baos = new FileOutputStream(tmpFile);

              bos = new BufferedOutputStream(baos);

              }

              bos.write(buffs, 0, rtnPos);

              baos.flush();

              } else {

              System.out.println("test :" + value + "--" + strBuff);

              value = value + strBuff;

              }

              }

              }

              } catch (IOException e) {

              status = 4;

              }

              return status;

              }

              private int preCheck() {

              int errCode = 0;

              if ( request == null )

              return 1;

              if ( uploadPath == null || uploadPath.trim().length() == 0 )

              return 2;

              else{

              File tmpF = new File(uploadPath);

              if (!tmpF.exists())

              return 2;

              }

              String contentType = request.getContentType();

              if ( contentType.indexOf("multipart/form-data") == -1 )

              return 3;

              return errCode;

              }

              public String getParameter(String name){

              String value = "";

              if ( name == null || name.trim().length() == 0 )

              return value;

              value = (paramHt.get(name) == null)?"":(String)((ArrayList)paramHt.get(name)).get(0);

              return value;

              }

              public String[] getParameters(String name){

              if ( name == null || name.trim().length() == 0 )

              return null;

              if ( paramHt.get(name) == null )

              return null;

              ArrayList al = (ArrayList)paramHt.get(name);

              String[] strArr = new String[al.size()];

              for ( int i=0;i

              strArr[i] = (String)al.get(i);

              return strArr;

              }

              public int getUpdFileSize(){

              return updFileArr.size();

              }

              public String[] getUpdFileNames(){

              String[] strArr = new String[updFileArr.size()];

              for ( int i=0;i

              strArr[i] = (String)updFileArr.get(i);

              return strArr;

              }

              private String getFileName(String input){

              int fIndex = input.lastIndexOf("\\");

              if (fIndex == -1) {

              fIndex = input.lastIndexOf("/");

              if (fIndex == -1) {

              return input;

              }

              }

              input = input.substring(fIndex + 1);

              return input;

              }

              private String getFileNameByTime(String input){

              int index = input.indexOf(".");

              Date dt = new Date();

              SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

              return input.substring(0,index) + sdf.format(dt) + input.substring(index);

              }

              }

              說明:

              這個類基本解決了上一貼的上一貼說的存在的bug和不足。主要做了如下修正。

              用戶可以設定文件上傳的路徑,這里沒有用request對象的getRealPath方法來取得相對路徑,而是用了絕對路徑。是一個小敗筆。因為有時候用戶只是得到服務器的一個應用,而不知道整個服務器的路徑。但是既然getRealPath自己可以得到,用戶自己取得也可以。

              在文件上傳處理的時候,預先進行了check,把一些可能出現的造成上傳失敗的情況拍查掉。避免該類出現不該出現的異常。

              捕獲了IO異常,避免文件上傳的時候出現異常時程序的不友好表現

              提供了方法返回form表單中其他參數的取得,模擬了HttpServletRequest對象的getParameter和getParameters方法(后面這個方法是叫這個名字么-_-b),取得Parameter的名稱的方法沒有提供,是個小缺陷。

              提供了方法返回上傳的文件的件數和上傳的文件名,方便用戶作其他操作。

              現在介紹下JSP頁面中如何用這個類實現上傳。

              首先,要把這個類編譯后的class文件拷貝到WEB-INF/classes/目錄下。注意保持package的結構。

              在jsp頁面中引用這個類

              使用的時候的注意事項:

              一定要設定request對象。

              一定要設定正確的上傳路徑。

              執行完了之后才可以得到其他參數,因為執行了之后這些參數才被分析。

              1,2兩點如果沒有做到的話,process方法執行的時候匯報錯。

              各個用戶可用的方法及說明:

              設定requet對象。

              public void setRequest(HttpServletRequest request)

              設定文件上傳的路徑。

              public void setUploadPath(String path)

              文件上傳處理主程序。

              @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3

              沒有設定正確的enctype;4 文件操作異常。

              public int process()

              根據name取得form表單中其他傳遞的參數的值(多個的話返回其中一個)

              public String getParameter(String name)

              根據name取得form表單中其他傳遞的參數的值(返回數組,可有多個)

              public String[] getParameters(String name)

              取得上傳成功文件的個數

              public int getUpdFileSize()

              取得上傳的文件名對應的數組。

              public String[] getUpdFileNames()

              注意process方法地返回值,在不是0的情況下操作失敗。

              以下提供測試類以及測試頁面(見附件):

              HelloPostFile.html

              HelloPostFile.jsp

              寫在jsp中的代碼的測試文件。

              HelloPostFileWithClass.html

              HelloPostFileWithClass.jsp

              抽出class后的測試文件。

              src在

              WEB-INF/src/

              class在

              WEB-INF/classes/

              另:

              由于這個文件被我在中文日文系統下編輯過,注釋出現亂碼,所以大部分都刪掉了,見諒。

              下載:WEB-INF.zip

              JSP文件下載類整理完成。可以在JSP頁面中實現簡單的下載,支持文件打包下載功能。支持將字符串或者流生成文件提供下載的功能。但是也有一些缺點。現把這個類的基本介紹總結如下。

              名稱:jsp頁面下載類

              作者:SinNeR

              Mail:vogoals[at]hotmail.com

              特點及功能介紹:

              支持單文件下載。支持多文件zip壓縮下載。多文件zip壓縮可在服務器保留或者刪除副本。支持將特定的字符串或者byte數組以指定的文件名提供下載。

              在下載過程中需要提供response對象。并且選擇下載形式。

              下載處理前先進行check,避免出現錯誤。

              下載處理過程中出錯時,會報告錯誤信息。

              日文系統下文件名是中文時出現亂碼問題。

              處理前需要進行相對繁瑣的設定。

              現介紹下使用者可見的方法的功能。

              設定實現下載必須的response對象。

              public void setResponse(HttpServletResponse response)

              設定下載方式:0 為普通單文件下載。 1 為多文件壓縮成zip包下載。 2 為將指定的字符串等拼接成文件內容提供給用戶下載。

              public void setDownType(int fileType)

              設定下載時顯示給用的文件名。

              public void setDisFileName(String fileName)

              壓縮文件下載時,設定壓縮文件暫時保存的路徑(路徑為絕對路徑)

              public void setZipFilePath( String path )

              壓縮文件下載時,設定服務器端生成的壓縮文件是否刪除。True 刪除;false 保留。

              public void setZipDelFlag(boolean b)

              壓縮文件下載時,設定要壓縮的文件的文件路徑(路徑為絕對路徑)

              public void setZipFileNames(String[] fileNames)

              單文件下載時,設定下載文件的路徑(絕對路徑)

              public void setDownFileName(String fileName)

              將字符串生成文件內容模擬下載時,設定文件的內容。參數為字符串(可多次調用)

              public int setFileContent(String fileContent)

              將字符串生成文件內容模擬下載時,設定文件的內容。參數為byte數組(可多次調用)

              返回值:0 操作正常; 9 出現IO異常。

              public int setFileContent(byte[] fileContent)

              將字符串生成文件內容模擬下載時,調用此方法結束文件內容設定。

              返回值:0 操作正常; 9 出現IO異常。

              public int setFileContentEnd()

              主處理函數。

              返回值: 0 處理正常;1 未設定response對象。 2 未設定文件下載方式。 3 未設定要顯示的文件名。 4 未設定要下載的文件路徑,或者設定的下載的文件路徑不存在。 9 IO異常。

              public int process()

              現在介紹不同下載模式下的簡單流程:

              單文件下載流程:

              //實例初始化

              JspFileDownload jfd = new JspFileDownload();

              //設定response對象

              jfd.setResponse(response);

              //設定文件下載模式 0 單文件下載。

              jfd.setDownType(0);

              //設定顯示的文件名 xxxx.xxx

              jfd.setDisFileName(filename);

              //設定要下載的文件的路徑,絕對路徑

              jfd.setDownFileName(filePath);

              //主處理函數。注意處理返回值。

              int result = jfd.process();

              多文件壓縮成ZIP文件下載:

              //實例初始化

              JspFileDownload jfd = new JspFileDownload();

              //設定response對象。

              jfd.setResponse(response);

              //設定下載模式 1 多文件壓縮成ZIP文件下載。

              jfd.setDownType(1);

              //設定顯示的文件名

              jfd.setDisFileName(filename);

              //設定要下載的文件的路徑(數組,絕對路徑)

              jfd.setZipFileNames(fileNames);

              //設定服務器端生成的zip文件是否保留。 true 刪除 false 保留,默認為false

              jfd.setZipDelFlag(true);

              //設定zip文件暫時保存的路徑 (是文件夾)

              jfd.setZipFilePath(zipfolder);

              //主處理函數 注意返回值

              Int result = jfd.process();

              將字符串生成為文件內容,模擬文件下載:

              //實例初始化

              JspFileDownload jfd = new JspFileDownload();

              //設定response對象。

              jfd.setResponse(response);

              //設定下載模式 2 將字符串作為文件內容,實現文件下載。

              jfd.setDownType(2);

              //設定文件顯示的名稱。

              jfd.setDisFileName(request.getParameter("filename"));

              //主處理函數,下載前check,注意返回值

              out.print(jfd.process());

              //設定要寫入文件的內容,參數可為字符串或者byte數組。可多次調用。

              jfd.setFileContent(request.getParameter("name"));

              //文件內容設定完了,調用函數。

              jfd.setFileContentEnd();

              以上就是簡單的使用介紹。下面貼出主處理類的代碼。由于在日文系統下編輯的文件。注釋只能寫英文,英文太差-_-b。多包涵。

              package com.vogoal.util;

              import java.io.BufferedInputStream;

              import java.io.File;

              import java.io.FileInputStream;

              import java.io.FileOutputStream;

              import java.io.IOException;

              import java.io.InputStream;

              import java.util.zip.ZipEntry;

              import java.util.zip.ZipOutputStream;

              import javax.servlet.http.HttpServletResponse;

              /*

              * vogoalAPI 1.0

              * Auther SinNeR@blueidea.com

              * by vogoal.com

              * mail: vogoals@hotmail.com

              */

              /**

              * JSP FILE DOWNLOAD SUPPORT

              *

              * @author SinNeR

              * @version 1.0

              */

              public class JspFileDownload {

              /** request object */

              private HttpServletResponse response = null;

              /** file type: -1 un-setting; 0 normal file; 1 zip file ;2 stream*/

              private int fileType = -1;

              /** file name to be displayed */

              private String disFileName = null;

              /** zip file path */

              private String zipFilePath = null;

              /** file to be zipped */

              private String[] zipFileNames = null;

              private boolean zipDelFlag = false;

              /** file to be downloaded */

              private String downFileName = null;

              /** error code 0 */

              private static final int PROCESS_OK = 0;

              /** error code 1 */

              private static final int RESPONSE_IS_NULL = 1;

              /** error code 2 */

              private static final int UNSET_DOWNLOADTYPE = 2;

              /** error code 3 */

              private static final int UNSET_DIS_FILE_NAME = 3;

              /** error code 4 */

              private static final int UNSET_DOWN_FILE_NAME = 4;

              /** error code 9 */

              private static final int IO_EXCEPTION = 9;

              /**

              * set response object

              * @param response response Object

              */

              public void setResponse(HttpServletResponse response){

              this.response = response;

              }

              /**

              * set file type 0 normal file; 1 zip file ;2 stream

              * @param fileType

              */

              public void setDownType(int fileType){

              this.fileType = fileType;

              }

              /**

              * set display file name

              * @param fileName

              */

              public void setDisFileName(String fileName){

              this.disFileName = fileName;

              }

              /**

              * set zip file path

              * @param fileNames

              */

              public void setZipFilePath( String path ){

              this.zipFilePath = path;

              }

              public void setZipDelFlag(boolean b){

              this.zipDelFlag = b;

              }

              /**

              * set zip file names

              * @param fileNames

              */

              public void setZipFileNames(String[] fileNames){

              this.zipFileNames = fileNames;

              }

              /**

              * set download file name

              * @param fileName

              */

              public void setDownFileName(String fileName){

              this.downFileName = fileName;

              }

              /**

              * set file content

              * @param fileContent

              */

              public int setFileContent(String fileContent){

              try{

              byte[] buffs = fileContent.getBytes("UTF-8");

              response.getOutputStream().write(buffs);

              }catch(IOException e){

              return IO_EXCEPTION;

              }

              return PROCESS_OK;

              }

              /**

              * set file content

              * @param fileContent

              */

              public int setFileContent(byte[] fileContent){

              try{

              response.getOutputStream().write(fileContent);

              }catch(IOException e){

              return IO_EXCEPTION;

              }

              return PROCESS_OK;

              }

              /**

              * set file content end

              *

              */

              public int setFileContentEnd(){

              try{

              response.getOutputStream().close();

              }catch(IOException e){

              return IO_EXCEPTION;

              }

              return PROCESS_OK;

              }

              /**

              * main process

              * @return

              */

              public int process(){

              int status = PROCESS_OK;

              status = preCheck();

              if ( status != PROCESS_OK )

              return status;

              String fileName = disFileName;

              response.setContentType("APPLICATION/OCTET-STREAM");

              response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");

              int BUFSIZE = 1024 * 8;

              int rtnPos = 0;

              byte[] buffs = new byte[ BUFSIZE ];

              FileInputStream inStream = null;

              ZipOutputStream zos = null;

              InputStream is = null;

              String filepath = null;

              try{

              if ( fileType == 0 || fileType == 1){

              if ( fileType == 0 ){

              filepath = downFileName;

              }else{

              filepath = zipFilePath + fileName;

              String[] fileToZip = zipFileNames;

              zos=new ZipOutputStream(new FileOutputStream(filepath));

              ZipEntry ze=null;

              byte[] buf=new byte[BUFSIZE];

              int readLen=0;

              for (int i= 0;i

              File f= new File(fileToZip[i]);

              ze=new ZipEntry(f.getName());

              ze.setSize(f.length());

              ze.setTime(f.lastModified());

              zos.putNextEntry(ze);

              is=new BufferedInputStream(new FileInputStream(f));

              while ((readLen=is.read(buf, 0, BUFSIZE))!=-1) {

              zos.write(buf, 0, readLen);

              }

              is.close();

              }

              zos.close();

              }

              inStream =new FileInputStream(filepath);

              while((rtnPos=inStream.read(buffs)) >0)

              response.getOutputStream().write(buffs,0,rtnPos);

              response.getOutputStream().close();

              inStream.close();

              }

              if ( zipDelFlag ){

              File fToDel = new File(filepath);

              fToDel.delete();

              }

              }catch(IOException e){

              return IO_EXCEPTION;

              }finally{

              try{

              if ( inStream != null ){

              inStream.close();

              inStream = null;

              }

              if ( zos != null ){

              zos.close();

              zos = null;

              }

              if ( is != null ){

              is.close();

              is = null;

              }

              }catch (IOException e){

              }

              }

              return status;

              }

              /**

              * pre check.

              * @return

              */

              private int preCheck(){

              if ( response == null )

              return RESPONSE_IS_NULL;

              if ( disFileName == null || disFileName.trim().length() == 0 )

              return UNSET_DIS_FILE_NAME;

              if ( fileType == -1 )

              return UNSET_DOWNLOADTYPE;

              else if ( fileType == 0 ){

              if ( downFileName == null || downFileName.trim().length() == 0 )

              return UNSET_DOWN_FILE_NAME;

              else{

              if ( !isFile( downFileName ) )

              return UNSET_DOWN_FILE_NAME;

              }

              }else if ( fileType == 1 ){

              if ( zipFilePath == null || zipFilePath.length() == 0 )

              return UNSET_DOWN_FILE_NAME;

              else{

              if ( !isDirect(zipFilePath) )

              return UNSET_DOWN_FILE_NAME;

              }

              if ( zipFileNames == null || zipFileNames.length == 0 )

              return UNSET_DOWN_FILE_NAME;

              else{

              for ( int i=0;i

              if ( zipFileNames[i] == null || zipFileNames[i].trim().length() == 0 )

              return UNSET_DOWN_FILE_NAME;

              else{

              if ( !isFile( zipFileNames[i] ) )

              return UNSET_DOWN_FILE_NAME;

              }

              }

              }

              }else if ( fileType == 2 ){

              //doing nothing

              }else{

              return UNSET_DOWNLOADTYPE;

              }

              return PROCESS_OK;

              }

              private boolean isFile(String fileName){

              File f = new File(fileName);

              if (!f.exists() || !f.isFile())

              return false;

              return true;

              }

              private boolean isDirect(String filePath){

              File f = new File(filePath);

              if (!f.exists() || !f.isDirectory())

              return false;

              return true;

              }

              }

              至此,jsp頁面文件下載介紹完成。

              使用的時候,把這個類生成的class文件拷貝到WEB-INF/classes下。(注意保持包的路徑)

              然后在使用的頁面import進這個class即可。

              注意:

              可能存在編碼方式的問題,如果出現或者有別的bug請聯系我,我來debug。

              附件為這個類的source以及測試程序。

              附件說明:

              單文件下載測試程序

              請求頁面:downloadSimpleFile.html

              下載功能實現頁面:downloadSimpleFile.jsp

              多文件壓縮成zip文件下載的測試程序

              請求頁面:downloadZipFile.html

              下載功能實現頁面:downloadZipFile.jsp

              字符串生成文件內容模擬文件下載的測試程序。

              請求頁面:downloadStreamFile.html

              下載功能實現頁面:downloadStreamFile.jsp

              Source及class文件。

              Source WEB-INF/src/com/vogoal/util/ JspFileDownload.java

              Class文件WEB-INF/classes/com/vogoal/util/ JspFileDownload.class

            【JSP頁面如何實現文件上傳下載】相關文章:

            JavaWeb如何實現文件上傳下載功能08-23

            如何使用JavaScript實現頁面定時跳轉10-18

            編寫Java無腳本的JSP頁面的方法08-18

            php頁面緩存實現方法07-20

            PHP頁面跳轉實現技巧09-19

            PHP中實現頁面跳轉07-06

            PHP頁面跳轉幾種實現技巧07-26

            如何使用php語言實現文件名稱08-17

            Html5如何實現文件異步上傳功能09-16

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看