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

首頁 > 編程 > JavaScript > 正文

jquery插件ajaxupload實現文件上傳操作

2019-11-20 11:03:22
字體:
來源:轉載
供稿:網友

本文實例講述了jquery插件ajaxupload實現文件上傳操作代碼。分享給大家供大家參考。具體如下:
運行效果截圖如下:

圖1 文件上傳前

圖2 文件上傳后

具體代碼如下:

1、創建頁面并編寫HTML

上傳文檔: 

<div class="uploadFile">  <span id="doc"><input type="text" disabled="disabled" /></span>  <input type="hidden" id="hidFileName" />  <input type="button" id="btnUploadFile" value="上傳" />  <input type="button" id="btnDeleteFile" value="刪除" /> </div> 

上傳圖片: 

<div class="uploadImg">  <img id="imgShow" src="/images/nophoto.gif" />  <input type="hidden" id="hidImgName" />  <input type="button" id="btnUploadImg" value="上傳" />  <input type="button" id="btnDeleteImg" value="刪除" /> </div> 

2、引用AjaxUpload.js文件

<script src="/js/common/AjaxUpload.js" type="text/javascript"></script> 

3、編寫JS腳本

window.onload = function() {  init(); //初始化 }  //初始化 function init() {  //初始化文檔上傳  var btnFile = document.getElementById("btnUploadFile");  var doc = document.getElementById("doc");  var hidFileName = document.getElementById("hidFileName");  document.getElementById("btnDeleteFile").onclick = function() { DelFile(doc, hidFileName); };  g_AjxUploadFile(btnFile, doc, hidFileName);    //初始化圖片上傳  var btnImg = document.getElementById("btnUploadImg");  var img = document.getElementById("imgShow");  var hidImgName = document.getElementById("hidImgName");  document.getElementById("btnDeleteImg").onclick = function() { DelImg(img, hidImgName); };  g_AjxUploadImg(btnImg, img, hidImgName); }   var g_AjxTempDir = "/file/temp/"; //文檔上傳 function g_AjxUploadFile(btn, doc, hidPut, action) {  var button = btn, interval;  new AjaxUpload(button, {  action: ((action == null || action == undefined) ? '/Common/UploadHandler.ashx?fileType=file' : action),   data: {},   name: 'myfile',   onSubmit: function(file, ext) {    if (!(ext && /^(rar|zip|pdf|pdfx|txt|csv|xls|xlsx|doc|docx|RAR|ZIP|PDF|PDFX|TXT|CSV|XLS|XLSX|DOC|DOCX)$/.test(ext))) {     alert("您上傳的文檔格式不對,請重新選擇!");     return false;    }   },   onComplete: function(file, response) {    flagValue = response;    if (flagValue == "1") {     alert("您上傳的文檔格式不對,請重新選擇!");    }    else if (flagValue == "2") {     alert("您上傳的文檔大于2M,請重新選擇!");    }    else if (flagValue == "3") {     alert("文檔上傳失??!");    }    else {     hidPut.value = response;     doc.innerHTML="<a href='" + g_AjxTempDir + response + "' target='_blank'>" + response + "</a>";    }   }  }); } //圖片上傳 function g_AjxUploadImg(btn, img, hidPut) {  var button = btn, interval;  new AjaxUpload(button, {   action: '/Common/UploadHandler.ashx?fileType=img',   data: {},   name: 'myfile',   onSubmit: function(file, ext) {    if (!(ext && /^(jpg|JPG|png|PNG|gif|GIF)$/.test(ext))) {     alert("您上傳的圖片格式不對,請重新選擇!");     return false;    }   },   onComplete: function(file, response) {    flagValue = response;    if (flagValue == "1") {     alert("您上傳的圖片格式不對,請重新選擇!");    }    else if (flagValue == "2") {     alert("您上傳的圖片大于200K,請重新選擇!");    }    else if (flagValue == "3") {     alert("圖片上傳失?。?);    }    else {     hidPut.value = response;     img.src = g_AjxTempDir + response;    }   }  }); }  //刪除文檔 function DelFile(doc, hidPut) {  hidPut.value = "";  doc.innerHTML = "<input type=/"text/" disabled=/"disabled/" />"; }  //刪除圖片 function DelImg(img, hidPut) {  hidPut.value = "";  img.src = "/images/nophoto.gif"; } 

4、創建/Common/UploadHandler.ashx處理程序

<%@ WebHandler Language="C#" Class="UploadHandler" %>  using System; using System.Web; using System.Text.RegularExpressions; using System.IO;  public class UploadHandler : IHttpHandler {  private string _filedir = ""; //文件目錄  /// <summary>  /// 處理上傳文件(1:文件格式不正確、2:文件大小不正確、3:上傳失敗、文件名稱:上傳成功)  /// </summary>  /// <param name="context"></param>  public void ProcessRequest (HttpContext context) {   _filedir = context.Server.MapPath(@"/file/temp/");   try   {    string result = "3";    string fileType = context.Request.QueryString["fileType"]; //獲取上傳文件類型    if (fileType == "file")    {     result = UploadFile(context); //文檔上傳    }    else if (fileType == "img")    {     result = UploadImg(context); //圖片上傳    }    context.Response.Write(result);   }   catch   {    context.Response.Write("3");//3文件上傳失敗   }  }    /// <summary>  /// 文檔上傳  /// </summary>  /// <param name="context"></param>  /// <returns></returns>  private string UploadFile(HttpContext context)  {   int cout = context.Request.Files.Count;   if (cout > 0)   {    HttpPostedFile hpf = context.Request.Files[0];    if (hpf != null)    {     string fileExt = Path.GetExtension(hpf.FileName).ToLower();     //只能上傳文件,過濾不可上傳的文件類型     string fileFilt = ".rar|.zip|.pdf|.pdfx|.txt|.csv|.xls|.xlsx|.doc|.docx......";     if (fileFilt.IndexOf(fileExt) <= -1)     {      return "1";     }          //判斷文件大小     int length = hpf.ContentLength;     if (length > 2097152)     {      return "2";     }          Random rd = new Random();     DateTime nowTime = DateTime.Now;     string newFileName = nowTime.Year.ToString() + nowTime.Month.ToString() + nowTime.Day.ToString() + nowTime.Hour.ToString() + nowTime.Minute.ToString() + nowTime.Second.ToString() + rd.Next(1000, 1000000) + Path.GetExtension(hpf.FileName);     if (!Directory.Exists(_filedir))     {      Directory.CreateDirectory(_filedir);     }     string fileName = _filedir + newFileName;     hpf.SaveAs(fileName);     return newFileName;    }    }   return "3";  }   /// <summary>  /// 圖片上傳  /// </summary>  /// <param name="context"></param>  /// <returns></returns>  private string UploadImg(HttpContext context)  {   int cout = context.Request.Files.Count;   if (cout > 0)   {    HttpPostedFile hpf = context.Request.Files[0];    if (hpf != null)    {     string fileExt = Path.GetExtension(hpf.FileName).ToLower();     //只能上傳文件,過濾不可上傳的文件類型     string fileFilt = ".gif|.jpg|.php|.jsp|.jpeg|.png|......";     if (fileFilt.IndexOf(fileExt) <= -1)     {      return "1";     }          //判斷文件大小     int length = hpf.ContentLength;     if (length > 204800)     {      return "2";     }          Random rd = new Random();     DateTime nowTime = DateTime.Now;     string newFileName = nowTime.Year.ToString() + nowTime.Month.ToString() + nowTime.Day.ToString() + nowTime.Hour.ToString() + nowTime.Minute.ToString() + nowTime.Second.ToString() + rd.Next(1000, 1000000) + Path.GetExtension(hpf.FileName);     if (!Directory.Exists(_filedir))     {      Directory.CreateDirectory(_filedir);     }     string fileName = _filedir + newFileName;     hpf.SaveAs(fileName);     return newFileName;    }    }   return "3";  }    #region IHttpHandler 成員   public bool IsReusable  {   get { throw new NotImplementedException(); }  }   #endregion } 

附件1:頁面CSS樣式

/*上傳文件*/ .uploadFile{margin-bottom:10px;} /*上傳圖片*/ .uploadImg{} .uploadImg img{width:102px; height:64px; border:1px solid #CCCCCC; display: block;} 

附件2:AjaxUpload.js文件

/**  * AJAX Upload ( http://valums.com/ajax-upload/ )  * Copyright (c) Andris Valums  * Licensed under the MIT license ( http://valums.com/mit-license/ )  * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions  */ (function () {  /* global window */  /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */   /**   * Wrapper for FireBug's console.log   */   function log() {   if (typeof(console) != 'undefined' && typeof(console.log) == 'function') {    Array.prototype.unshift.call(arguments, '[Ajax Upload]');    console.log(Array.prototype.join.call(arguments, ' '));   }  }   /**   * Attaches event to a dom element.   * @param {Element} el   * @param type event name   * @param fn callback This refers to the passed element   */   function addEvent(el, type, fn) {   if (el.addEventListener) {    el.addEventListener(type, fn, false);   } else if (el.attachEvent) {    el.attachEvent('on' + type, function () {     fn.call(el);    });   } else {    throw new Error('not supported or DOM not loaded');   }  }   /**   * Attaches resize event to a window, limiting   * number of event fired. Fires only when encounteres   * delay of 100 after series of events.   *   * Some browsers fire event multiple times when resizing   * http://www.quirksmode.org/dom/events/resize.html   *   * @param fn callback This refers to the passed element   */   function addResizeEvent(fn) {   var timeout;    addEvent(window, 'resize', function () {    if (timeout) {     clearTimeout(timeout);    }    timeout = setTimeout(fn, 100);   });  }   // Needs more testing, will be rewriten for next version    // getOffset function copied from jQuery lib (http://jquery.com/)  if (document.documentElement.getBoundingClientRect) {   // Get Offset using getBoundingClientRect   // http://ejohn.org/blog/getboundingclientrect-is-awesome/   var getOffset = function (el) {    var box = el.getBoundingClientRect();    var doc = el.ownerDocument;    var body = doc.body;    var docElem = doc.documentElement; // for ie    var clientTop = docElem.clientTop || body.clientTop || 0;    var clientLeft = docElem.clientLeft || body.clientLeft || 0;     // In Internet Explorer 7 getBoundingClientRect property is treated as physical,    // while others are logical. Make all logical, like in IE8.    var zoom = 1;    if (body.getBoundingClientRect) {     var bound = body.getBoundingClientRect();     zoom = (bound.right - bound.left) / body.clientWidth;    }     if (zoom > 1) {     clientTop = 0;     clientLeft = 0;    }     var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop,     left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;     return {     top: top,     left: left    };   };  } else {   // Get offset adding all offsets   var getOffset = function (el) {    var top = 0,     left = 0;    do {     top += el.offsetTop || 0;     left += el.offsetLeft || 0;     el = el.offsetParent;    } while (el);     return {     left: left,     top: top    };   };  }   /**   * Returns left, top, right and bottom properties describing the border-box,   * in pixels, with the top-left relative to the body   * @param {Element} el   * @return {Object} Contains left, top, right,bottom   */   function getBox(el) {   var left, right, top, bottom;   var offset = getOffset(el);   left = offset.left;   top = offset.top;    right = left + el.offsetWidth;   bottom = top + el.offsetHeight;    return {    left: left,    right: right,    top: top,    bottom: bottom   };  }   /**   * Helper that takes object literal   * and add all properties to element.style   * @param {Element} el   * @param {Object} styles   */   function addStyles(el, styles) {   for (var name in styles) {    if (styles.hasOwnProperty(name)) {     el.style[name] = styles[name];    }   }  }   /**   * Function places an absolutely positioned   * element on top of the specified element   * copying position and dimentions.   * @param {Element} from   * @param {Element} to   */   function copyLayout(from, to) {   var box = getBox(from);    addStyles(to, {    position: 'absolute',    left: box.left + 'px',    top: box.top + 'px',    width: from.offsetWidth + 'px',    height: from.offsetHeight + 'px'   });  }   /**   * Creates and returns element from html chunk   * Uses innerHTML to create an element   */  var toElement = (function () {   var div = document.createElement('div');   return function (html) {    div.innerHTML = html;    var el = div.firstChild;    return div.removeChild(el);   };  })();   /**   * Function generates unique id   * @return unique id   */  var getUID = (function () {   var id = 0;   return function () {    return 'ValumsAjaxUpload' + id++;   };  })();   /**   * Get file name from path   * @param {String} file path to file   * @return filename   */   function fileFromPath(file) {   return file.replace(/.*(//|//)/, "");  }   /**   * Get file extension lowercase   * @param {String} file name   * @return file extenstion   */   function getExt(file) {   return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';  }   function hasClass(el, name) {   var re = new RegExp('//b' + name + '//b');   return re.test(el.className);  }   function addClass(el, name) {   if (!hasClass(el, name)) {    el.className += ' ' + name;   }  }   function removeClass(el, name) {   var re = new RegExp('//b' + name + '//b');   el.className = el.className.replace(re, '');  }   function removeNode(el) {   el.parentNode.removeChild(el);  }   /**   * Easy styling and uploading   * @constructor   * @param button An element you want convert to   * upload button. Tested dimentions up to 500x500px   * @param {Object} options See defaults below.   */  window.AjaxUpload = function (button, options) {   this._settings = {    // Location of the server-side upload script    action: 'upload.php',    // File upload name    name: 'userfile',    // Additional data to send    data: {},    // Submit file as soon as it's selected    autoSubmit: true,    // The type of data that you're expecting back from the server.    // html and xml are detected automatically.    // Only useful when you are using json data as a response.    // Set to "json" in that case.    responseType: false,    // Class applied to button when mouse is hovered    hoverClass: 'hover',    // Class applied to button when AU is disabled    disabledClass: 'disabled',    // When user selects a file, useful with autoSubmit disabled    // You can return false to cancel upload       onChange: function (file, extension) {},    // Callback to fire before file is uploaded    // You can return false to cancel upload    onSubmit: function (file, extension) {},    // Fired when file upload is completed    // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!    onComplete: function (file, response) {}   };    // Merge the users options with our defaults   for (var i in options) {    if (options.hasOwnProperty(i)) {     this._settings[i] = options[i];    }   }    // button isn't necessary a dom element   if (button.jquery) {    // jQuery object was passed    button = button[0];   } else if (typeof button == "string") {    if (/^#.*/.test(button)) {     // If jQuery user passes #elementId don't break it         button = button.slice(1);    }     button = document.getElementById(button);   }    if (!button || button.nodeType !== 1) {    throw new Error("Please make sure that you're passing a valid element");   }    if (button.nodeName.toUpperCase() == 'A') {    // disable link          addEvent(button, 'click', function (e) {     if (e && e.preventDefault) {      e.preventDefault();     } else if (window.event) {      window.event.returnValue = false;     }    });   }    // DOM element   this._button = button;   // DOM element       this._input = null;   // If disabled clicking on button won't do anything   this._disabled = false;    // if the button was disabled before refresh if will remain   // disabled in FireFox, let's fix it   this.enable();    this._rerouteClicks();  };   // assigning methods to our class  AjaxUpload.prototype = {   setData: function (data) {    this._settings.data = data;   },   disable: function () {    addClass(this._button, this._settings.disabledClass);    this._disabled = true;     var nodeName = this._button.nodeName.toUpperCase();    if (nodeName == 'INPUT' || nodeName == 'BUTTON') {     this._button.setAttribute('disabled', 'disabled');    }     // hide input    if (this._input) {     // We use visibility instead of display to fix problem with Safari 4     // The problem is that the value of input doesn't change if it     // has display none when user selects a file        this._input.parentNode.style.visibility = 'hidden';    }   },   enable: function () {    removeClass(this._button, this._settings.disabledClass);    this._button.removeAttribute('disabled');    this._disabled = false;    },   /**    * Creates invisible file input    * that will hover above the button    * <div><input type='file' /></div>    */   _createInput: function () {    var self = this;     var input = document.createElement("input");    input.setAttribute('type', 'file');    input.setAttribute('name', this._settings.name);     addStyles(input, {     'position': 'absolute',     // in Opera only 'browse' button     // is clickable and it is located at     // the right side of the input     'right': 0,     'margin': 0,     'padding': 0,     'fontSize': '480px',     'cursor': 'pointer'    });     var div = document.createElement("div");    addStyles(div, {     'display': 'block',     'position': 'absolute',     'overflow': 'hidden',     'margin': 0,     'padding': 0,     'opacity': 0,     // Make sure browse button is in the right side     // in Internet Explorer     'direction': 'ltr',     //Max zIndex supported by Opera 9.0-9.2     'zIndex': 2147483583    });     // Make sure that element opacity exists.    // Otherwise use IE filter       if (div.style.opacity !== "0") {     if (typeof(div.filters) == 'undefined') {      throw new Error('Opacity not supported by the browser');     }     div.style.filter = "alpha(opacity=0)";    }     addEvent(input, 'change', function () {      if (!input || input.value === '') {      return;     }      // Get filename from input, required         // as some browsers have path instead of it       var file = fileFromPath(input.value);      if (false === self._settings.onChange.call(self, file, getExt(file))) {      self._clearInput();      return;     }      // Submit form when value is changed     if (self._settings.autoSubmit) {      self.submit();     }    });     addEvent(input, 'mouseover', function () {     addClass(self._button, self._settings.hoverClass);    });     addEvent(input, 'mouseout', function () {     removeClass(self._button, self._settings.hoverClass);      // We use visibility instead of display to fix problem with Safari 4     // The problem is that the value of input doesn't change if it     // has display none when user selects a file        input.parentNode.style.visibility = 'hidden';     });     div.appendChild(input);    document.body.appendChild(div);     this._input = input;   },   _clearInput: function () {    if (!this._input) {     return;    }     // this._input.value = ''; Doesn't work in IE6            removeNode(this._input.parentNode);    this._input = null;    this._createInput();     removeClass(this._button, this._settings.hoverClass);   },   /**    * Function makes sure that when user clicks upload button,    * the this._input is clicked instead    */   _rerouteClicks: function () {    var self = this;     // IE will later display 'access denied' error    // if you use using self._input.click()    // other browsers just ignore click()     addEvent(self._button, 'mouseover', function () {     if (self._disabled) {      return;     }      if (!self._input) {      self._createInput();     }      var div = self._input.parentNode;     copyLayout(self._button, div);     div.style.visibility = 'visible';     });      // commented because we now hide input on mouseleave    /**     * When the window is resized the elements     * can be misaligned if button position depends     * on window size     */    //addResizeEvent(function(){    // if (self._input){    //  copyLayout(self._button, self._input.parentNode);    // }    //});       },   /**    * Creates iframe with unique name    * @return {Element} iframe    */   _createIframe: function () {    // We can't use getTime, because it sometimes return    // same value in safari :(    var id = getUID();     // We can't use following code as the name attribute    // won't be properly registered in IE6, and new window    // on form submit will open    // var iframe = document.createElement('iframe');    // iframe.setAttribute('name', id);           var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');    // src="javascript:false; was added    // because it possibly removes ie6 prompt    // "This page contains both secure and nonsecure items"    // Anyway, it doesn't do any harm.       iframe.setAttribute('id', id);     iframe.style.display = 'none';    document.body.appendChild(iframe);     return iframe;   },   /**    * Creates form, that will be submitted to iframe    * @param {Element} iframe Where to submit    * @return {Element} form    */   _createForm: function (iframe) {    var settings = this._settings;     // We can't use the following code in IE6    // var form = document.createElement('form');    // form.setAttribute('method', 'post');    // form.setAttribute('enctype', 'multipart/form-data');    // Because in this case file won't be attached to request         var form = toElement('<form method="post" enctype="multipart/form-data"></form>');     form.setAttribute('action', settings.action);    form.setAttribute('target', iframe.name);    form.style.display = 'none';    document.body.appendChild(form);     // Create hidden input element for each data key    for (var prop in settings.data) {     if (settings.data.hasOwnProperty(prop)) {      var el = document.createElement("input");      el.setAttribute('type', 'hidden');      el.setAttribute('name', prop);      el.setAttribute('value', settings.data[prop]);      form.appendChild(el);     }    }    return form;   },   /**    * Gets response from iframe and fires onComplete event when ready    * @param iframe    * @param file Filename to use in onComplete callback    */   _getResponse: function (iframe, file) {    // getting response    var toDeleteFlag = false,     self = this,     settings = this._settings;     addEvent(iframe, 'load', function () {      if ( // For Safari     iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" ||     // For FF, IE     iframe.src == "javascript:'<html></html>';") {      // First time around, do not delete.      // We reload to blank page, so that reloading main page      // does not re-submit the post.       if (toDeleteFlag) {       // Fix busy state in FF3       setTimeout(function () {        removeNode(iframe);       },       0);      }       return;     }      var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;      // fixing Opera 9.26,10.00     if (doc.readyState && doc.readyState != 'complete') {      // Opera fires load event multiple times      // Even when the DOM is not ready yet      // this fix should not affect other browsers      return;     }      // fixing Opera 9.64     if (doc.body && doc.body.innerHTML == "false") {      // In Opera 9.64 event was fired second time      // when body.innerHTML changed from false      // to server response approx. after 1 sec      return;     }      var response;      if (doc.XMLDocument) {      // response is a xml document Internet Explorer property      response = doc.XMLDocument;     } else if (doc.body) {      // response is html document or plain text      response = doc.body.innerHTML;       if (settings.responseType && settings.responseType.toLowerCase() == 'json') {       // If the document was sent as 'application/javascript' or       // 'text/javascript', then the browser wraps the text in a <pre>       // tag and performs html encoding on the contents. In this case,       // we need to pull the original text content from the text node's       // nodeValue property to retrieve the unmangled content.       // Note that IE6 only understands text/html       if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {        response = doc.body.firstChild.firstChild.nodeValue;       }        if (response) {        response = eval("(" + response + ")");       } else {        response = {};       }      }     } else {      // response is a xml document      response = doc;     }      settings.onComplete.call(self, file, response);      // Reload blank page, so that reloading main page     // does not re-submit the post. Also, remember to     // delete the frame     toDeleteFlag = true;      // Fix IE mixed content issue     iframe.src = "javascript:'<html></html>';";    });   },   /**    * Upload file contained in this._input    */   submit: function () {    var self = this,     settings = this._settings;     if (!this._input || this._input.value === '') {     return;    }     var file = fileFromPath(this._input.value);     // user returned false to cancel upload    if (false === settings.onSubmit.call(this, file, getExt(file))) {     this._clearInput();     return;    }     // sending request     var iframe = this._createIframe();    var form = this._createForm(iframe);     // assuming following structure    // div -> input type='file'    removeNode(this._input.parentNode);    removeClass(self._button, self._settings.hoverClass);     form.appendChild(this._input);     form.submit();     // request set, clean up        removeNode(form);    form = null;    removeNode(this._input);    this._input = null;     // Get response from iframe and fire onComplete event when ready    this._getResponse(iframe, file);     // get ready for next request       this._createInput();   }  }; })(); 

更多精彩內容請參考專題《ajax上傳技術匯總》《javascript文件上傳操作匯總》《jQuery上傳操作匯總》進行學習。

以上就是ajaxupload實現文件上傳操作的詳細代碼,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品久久影院| 主播福利视频一区| 国产ts人妖一区二区三区| 欧美极品第一页| 日韩欧美国产中文字幕| 久久成人在线视频| 日本国产欧美一区二区三区| 欧美福利视频网站| 中文字幕亚洲综合久久筱田步美| 国产一区二区在线播放| 欧美精品福利在线| 日本欧美在线视频| 亚洲人线精品午夜| 成人午夜一级二级三级| 亚洲成人久久久| 成人免费午夜电影| 亚洲一区美女视频在线观看免费| 精品国产鲁一鲁一区二区张丽| 欧美最顶级的aⅴ艳星| 国产日韩av高清| 日韩精品中文字幕在线播放| 97视频国产在线| 欧美一区二粉嫩精品国产一线天| 久久久av电影| 久久五月天色综合| 国产suv精品一区二区三区88区| 国产va免费精品高清在线| 在线播放国产一区二区三区| www.亚洲免费视频| 91豆花精品一区| 伊人久久大香线蕉av一区二区| 亚洲欧洲高清在线| 国产精品久久久久久超碰| 日本一欧美一欧美一亚洲视频| 国产欧美日韩丝袜精品一区| 色婷婷综合久久久久| 亚洲999一在线观看www| 亚洲91精品在线观看| 欧美理论电影网| 亚洲韩国欧洲国产日产av| 欧美激情乱人伦| 久久免费成人精品视频| 亚洲国产日韩精品在线| 最新亚洲国产精品| 欧美激情免费在线| 成人网中文字幕| 亚洲第一视频网站| 亚洲一区二区精品| 欧美亚洲激情视频| 亚洲在线观看视频| 亚洲免费高清视频| 亚洲天堂av电影| 国产精品免费观看在线| 成人免费自拍视频| 欧美性猛交xxxxx免费看| 亚洲毛茸茸少妇高潮呻吟| 国产日韩av在线播放| 亚洲午夜未删减在线观看| 欧美激情一区二区三级高清视频| 自拍偷拍亚洲区| 国外成人在线直播| 欧美专区在线观看| 国产精品手机播放| 影音先锋欧美在线资源| 欧美日韩国产成人高清视频| 亚洲精品成人免费| 91精品国产91久久久久久| 久久99国产综合精品女同| 色老头一区二区三区在线观看| 亚洲高清久久久久久| 狠狠久久五月精品中文字幕| 精品无人区太爽高潮在线播放| 在线成人免费网站| 国产精品国产三级国产aⅴ9色| 国产激情999| 欧洲亚洲女同hd| 国产精品丝袜视频| 国产激情久久久| 亚洲欧洲第一视频| 久久色免费在线视频| 亚洲va久久久噜噜噜久久天堂| 国产欧美韩国高清| 欧美成年人视频网站欧美| 欧美猛少妇色xxxxx| 国产成人亚洲综合91精品| 欧美成人三级视频网站| 亚洲综合色av| 欧美在线观看网站| 色综合久久天天综线观看| 中文字幕欧美日韩在线| 中文字幕欧美专区| 9.1国产丝袜在线观看| 最近的2019中文字幕免费一页| 日韩av中文字幕在线| 91亚洲国产成人精品性色| 91国产美女在线观看| 亚洲精品视频免费在线观看| 精品一区二区三区四区在线| 国产亚洲a∨片在线观看| 久久久久久综合网天天| 久久久91精品国产| 国产日韩欧美夫妻视频在线观看| 国语自产精品视频在线看一大j8| 久久天天躁狠狠躁夜夜躁| 欧美国产日韩视频| 欧美在线不卡区| 日韩在线免费av| 国内精品一区二区三区| 欧美日韩精品在线| 国产精品亚洲激情| 91精品视频在线| 亚洲视频999| 欧美黑人巨大精品一区二区| 国产一区二区三区网站| 亚洲欧美日韩爽爽影院| 自拍视频国产精品| 精品av在线播放| 亚洲成人网在线观看| 国产在线观看91精品一区| 国内成人精品一区| 欧美丰满老妇厨房牲生活| 国产精品igao视频| 日韩av黄色在线观看| 亚洲精品按摩视频| 国产成人精品视频在线观看| 黄色成人av网| 精品视频偷偷看在线观看| 中日韩午夜理伦电影免费| 亚洲欧美国产制服动漫| 久热爱精品视频线路一| 国产精品影院在线观看| 欧美在线视频观看| 日韩av片电影专区| 成人黄在线观看| 国产精品www网站| 欧美激情视频免费观看| 亚洲偷欧美偷国内偷| 美女视频久久黄| 亚洲精品久久久久久久久久久久| 国产成人综合一区二区三区| 精品国产一区二区三区久久狼黑人| 97婷婷涩涩精品一区| 精品美女永久免费视频| 欧美激情成人在线视频| 黑人精品xxx一区| 26uuu亚洲伊人春色| 久久全球大尺度高清视频| 国产精品自拍网| 九九精品在线视频| 精品一区二区亚洲| 国产精品电影久久久久电影网| 欧美成人性色生活仑片| 在线观看欧美日韩| 亚洲成色777777女色窝| 69**夜色精品国产69乱| 色诱女教师一区二区三区| 久久九九国产精品怡红院| 国产精品久久一区| 日韩av一区二区在线观看| 亚洲美女黄色片| 亚洲精品在线观看www| 久久99国产精品久久久久久久久| 日韩大片免费观看视频播放| 欧美麻豆久久久久久中文|