午夜勾魂曲-午夜福利自怕-午夜福利在线观看6080-午夜福利院电影-国产精品毛片AV久久97-国产精品麻豆高潮刺激A片

VUE-多文件斷點續(xù)傳、秒傳、分片上傳

2020-7-20    seo達人

凡是要知其然知其所以然

文件上傳相信很多朋友都有遇到過,那或許你也遇到過當上傳大文件時,上傳時間較長,且經(jīng)常失敗的困擾,并且失敗后,又得重新上傳很是煩人。那我們先了解下失敗的原因吧!


據(jù)我了解大概有以下原因:


服務器配置:例如在PHP中默認的文件上傳大小為8M【post_max_size = 8m】,若你在一個請求體中放入8M以上的內(nèi)容時,便會出現(xiàn)異常

請求超時:當你設置了接口的超時時間為10s,那么上傳大文件時,一個接口響應時間超過10s,那么便會被Faild掉。

網(wǎng)絡波動:這個就屬于不可控因素,也是較常見的問題。

基于以上原因,聰明的人們就想到了,將文件拆分多個小文件,依次上傳,不就解決以上1,2問題嘛,這便是分片上傳。 網(wǎng)絡波動這個實在不可控,也許一陣大風刮來,就斷網(wǎng)了呢。那這樣好了,既然斷網(wǎng)無法控制,那我可以控制只上傳已經(jīng)上傳的文件內(nèi)容,不就好了,這樣大大加快了重新上傳的速度。所以便有了“斷點續(xù)傳”一說。此時,人群中有人插了一嘴,有些文件我已經(jīng)上傳一遍了,為啥還要在上傳,能不能不浪費我流量和時間。喔...這個嘛,簡單,每次上傳時判斷下是否存在這個文件,若存在就不重新上傳便可,于是又有了“秒傳”一說。從此這"三兄弟" 便自行CP,統(tǒng)治了整個文件界。”

注意文中的代碼并非實際代碼,請移步至github查看代碼

https://github.com/pseudo-god...


分片上傳

HTML

原生INPUT樣式較丑,這里通過樣式疊加的方式,放一個Button.

 <div class="btns">

   <el-button-group>

     <el-button :disabled="changeDisabled">

       <i class="el-icon-upload2 el-icon--left" size="mini"></i>選擇文件

       <input

         v-if="!changeDisabled"

         type="file"

         :multiple="multiple"

         class="select-file-input"

         :accept="accept"

         @change="handleFileChange"

       />

     </el-button>

     <el-button :disabled="uploadDisabled" @click="handleUpload()"><i class="el-icon-upload el-icon--left" size="mini"></i>上傳</el-button>

     <el-button :disabled="pauseDisabled" @click="handlePause"><i class="el-icon-video-pause el-icon--left" size="mini"></i>暫停</el-button>

     <el-button :disabled="resumeDisabled" @click="handleResume"><i class="el-icon-video-play el-icon--left" size="mini"></i>恢復</el-button>

     <el-button :disabled="clearDisabled" @click="clearFiles"><i class="el-icon-video-play el-icon--left" size="mini"></i>清空</el-button>

   </el-button-group>

   <slot

   

//data 數(shù)據(jù)


var chunkSize = 10 * 1024 * 1024; // 切片大小

var fileIndex = 0; // 當前正在被遍歷的文件下標


data: () => ({

   container: {

     files: null

   },

   tempFilesArr: [], // 存儲files信息

   cancels: [], // 存儲要取消的請求

   tempThreads: 3,

   // 默認狀態(tài)

   status: Status.wait

 }),

   

一個稍微好看的UI就出來了。




選擇文件

選擇文件過程中,需要對外暴露出幾個鉤子,熟悉elementUi的同學應該很眼熟,這幾個鉤子基本與其一致。onExceed:文件超出個數(shù)限制時的鉤子、beforeUpload:文件上傳之前

fileIndex 這個很重要,因為是多文件上傳,所以定位當前正在被上傳的文件就很重要,基本都靠它


handleFileChange(e) {

 const files = e.target.files;

 if (!files) return;

 Object.assign(this.$data, this.$options.data()); // 重置data所有數(shù)據(jù)


 fileIndex = 0; // 重置文件下標

 this.container.files = files;

 // 判斷文件選擇的個數(shù)

 if (this.limit && this.container.files.length > this.limit) {

   this.onExceed && this.onExceed(files);

   return;

 }


 // 因filelist不可編輯,故拷貝filelist 對象

 var index = 0; // 所選文件的下標,主要用于剔除文件后,原文件list與臨時文件list不對應的情況

 for (const key in this.container.files) {

   if (this.container.files.hasOwnProperty(key)) {

     const file = this.container.files[key];


     if (this.beforeUpload) {

       const before = this.beforeUpload(file);

       if (before) {

         this.pushTempFile(file, index);

       }

     }


     if (!this.beforeUpload) {

       this.pushTempFile(file, index);

     }


     index++;

   }

 }

},

// 存入 tempFilesArr,為了上面的鉤子,所以將代碼做了拆分

pushTempFile(file, index) {

 // 額外的初始值

 const obj = {

   status: fileStatus.wait,

   chunkList: [],

   uploadProgress: 0,

   hashProgress: 0,

   index

 };

 for (const k in file) {

   obj[k] = file[k];

 }

 console.log('pushTempFile -> obj', obj);

 this.tempFilesArr.push(obj);

}

分片上傳

創(chuàng)建切片,循環(huán)分解文件即可


 createFileChunk(file, size = chunkSize) {

   const fileChunkList = [];

   var count = 0;

   while (count < file.size) {

     fileChunkList.push({

       file: file.slice(count, count + size)

     });

     count += size;

   }

   return fileChunkList;

 }

循環(huán)創(chuàng)建切片,既然咱們做的是多文件,所以這里就有循環(huán)去處理,依次創(chuàng)建文件切片,及切片的上傳。

async handleUpload(resume) {

 if (!this.container.files) return;

 this.status = Status.uploading;

 const filesArr = this.container.files;

 var tempFilesArr = this.tempFilesArr;


 for (let i = 0; i < tempFilesArr.length; i++) {

   fileIndex = i;

   //創(chuàng)建切片

   const fileChunkList = this.createFileChunk(

     filesArr[tempFilesArr[i].index]

   );

     

   tempFilesArr[i].fileHash ='xxxx'; // 先不用看這個,后面會講,占個位置

   tempFilesArr[i].chunkList = fileChunkList.map(({ file }, index) => ({

     fileHash: tempFilesArr[i].hash,

     fileName: tempFilesArr[i].name,

     index,

     hash: tempFilesArr[i].hash + '-' + index,

     chunk: file,

     size: file.size,

     uploaded: false,

     progress: 0, // 每個塊的上傳進度

     status: 'wait' // 上傳狀態(tài),用作進度狀態(tài)顯示

   }));

   

   //上傳切片

   await this.uploadChunks(this.tempFilesArr[i]);

 }

}

上傳切片,這個里需要考慮的問題較多,也算是核心吧,uploadChunks方法只負責構(gòu)造傳遞給后端的數(shù)據(jù),核心上傳功能放到sendRequest方法中

async uploadChunks(data) {

 var chunkData = data.chunkList;

 const requestDataList = chunkData

   .map(({ fileHash, chunk, fileName, index }) => {

     const formData = new FormData();

     formData.append('md5', fileHash);

     formData.append('file', chunk);

     formData.append('fileName', index); // 文件名使用切片的下標

     return { formData, index, fileName };

   });


 try {

   await this.sendRequest(requestDataList, chunkData);

 } catch (error) {

   // 上傳有被reject的

   this.$message.error('親 上傳失敗了,考慮重試下呦' + error);

   return;

 }


 // 合并切片

 const isUpload = chunkData.some(item => item.uploaded === false);

 console.log('created -> isUpload', isUpload);

 if (isUpload) {

   alert('存在失敗的切片');

 } else {

   // 執(zhí)行合并

   await this.mergeRequest(data);

 }

}

sendReques。上傳這是最重要的地方,也是容易失敗的地方,假設有10個分片,那我們?nèi)羰侵苯影l(fā)10個請求的話,很容易達到瀏覽器的瓶頸,所以需要對請求進行并發(fā)處理。


并發(fā)處理:這里我使用for循環(huán)控制并發(fā)的初始并發(fā)數(shù),然后在 handler 函數(shù)里調(diào)用自己,這樣就控制了并發(fā)。在handler中,通過數(shù)組API.shift模擬隊列的效果,來上傳切片。

重試: retryArr 數(shù)組存儲每個切片文件請求的重試次數(shù),做累加。比如[1,0,2],就是第0個文件切片報錯1次,第2個報錯2次。為保證能與文件做對應,const index = formInfo.index; 我們直接從數(shù)據(jù)中拿之前定義好的index。 若失敗后,將失敗的請求重新加入隊列即可。


關(guān)于并發(fā)及重試我寫了一個小Demo,若不理解可以自己在研究下,文件地址:https://github.com/pseudo-god... , 重試代碼好像被我弄丟了,大家要是有需求,我再補吧!

   // 并發(fā)處理

sendRequest(forms, chunkData) {

 var finished = 0;

 const total = forms.length;

 const that = this;

 const retryArr = []; // 數(shù)組存儲每個文件hash請求的重試次數(shù),做累加 比如[1,0,2],就是第0個文件切片報錯1次,第2個報錯2次


 return new Promise((resolve, reject) => {

   const handler = () => {

     if (forms.length) {

       // 出棧

       const formInfo = forms.shift();


       const formData = formInfo.formData;

       const index = formInfo.index;

       

       instance.post('fileChunk', formData, {

         onUploadProgress: that.createProgresshandler(chunkData[index]),

         cancelToken: new CancelToken(c => this.cancels.push(c)),

         timeout: 0

       }).then(res => {

         console.log('handler -> res', res);

         // 更改狀態(tài)

         chunkData[index].uploaded = true;

         chunkData[index].status = 'success';

         

         finished++;

         handler();

       })

         .catch(e => {

           // 若暫停,則禁止重試

           if (this.status === Status.pause) return;

           if (typeof retryArr[index] !== 'number') {

             retryArr[index] = 0;

           }


           // 更新狀態(tài)

           chunkData[index].status = 'warning';


           // 累加錯誤次數(shù)

           retryArr[index]++;


           // 重試3次

           if (retryArr[index] >= this.chunkRetry) {

             return reject('重試失敗', retryArr);

           }


           this.tempThreads++; // 釋放當前占用的通道


           // 將失敗的重新加入隊列

           forms.push(formInfo);

           handler();

         });

     }


     if (finished >= total) {

       resolve('done');

     }

   };


   // 控制并發(fā)

   for (let i = 0; i < this.tempThreads; i++) {

     handler();

   }

 });

}

切片的上傳進度,通過axios的onUploadProgress事件,結(jié)合createProgresshandler方法進行維護

// 切片上傳進度

createProgresshandler(item) {

 return p => {

   item.progress = parseInt(String((p.loaded / p.total) * 100));

   this.fileProgress();

 };

}

Hash計算

其實就是算一個文件的MD5值,MD5在整個項目中用到的地方也就幾點。

秒傳,需要通過MD5值判斷文件是否已存在。

續(xù)傳:需要用到MD5作為key值,當唯一值使用。

本項目主要使用worker處理,性能及速度都會有很大提升.

由于是多文件,所以HASH的計算進度也要體現(xiàn)在每個文件上,所以這里使用全局變量fileIndex來定位當前正在被上傳的文件

執(zhí)行計算hash


正在上傳文件


// 生成文件 hash(web-worker)

calculateHash(fileChunkList) {

 return new Promise(resolve => {

   this.container.worker = new Worker('./hash.js');

   this.container.worker.postMessage({ fileChunkList });

   this.container.worker.onmessage = e => {

     const { percentage, hash } = e.data;

     if (this.tempFilesArr[fileIndex]) {

       this.tempFilesArr[fileIndex].hashProgress = Number(

         percentage.toFixed(0)

       );

     }


     if (hash) {

       resolve(hash);

     }

   };

 });

}

因使用worker,所以我們不能直接使用NPM包方式使用MD5。需要單獨去下載spark-md5.js文件,并引入


//hash.js


self.importScripts("/spark-md5.min.js"); // 導入腳本

// 生成文件 hash

self.onmessage = e => {

 const { fileChunkList } = e.data;

 const spark = new self.SparkMD5.ArrayBuffer();

 let percentage = 0;

 let count = 0;

 const loadNext = index => {

   const reader = new FileReader();

   reader.readAsArrayBuffer(fileChunkList[index].file);

   reader.onload = e => {

     count++;

     spark.append(e.target.result);

     if (count === fileChunkList.length) {

       self.postMessage({

         percentage: 100,

         hash: spark.end()

       });

       self.close();

     } else {

       percentage += 100 / fileChunkList.length;

       self.postMessage({

         percentage

       });

       loadNext(count);

     }

   };

 };

 loadNext(0);

};

文件合并

當我們的切片全部上傳完畢后,就需要進行文件的合并,這里我們只需要請求接口即可

mergeRequest(data) {

  const obj = {

    md5: data.fileHash,

    fileName: data.name,

    fileChunkNum: data.chunkList.length

  };


  instance.post('fileChunk/merge', obj,

    {

      timeout: 0

    })

    .then((res) => {

      this.$message.success('上傳成功');

    });

}

Done: 至此一個分片上傳的功能便已完成

斷點續(xù)傳

顧名思義,就是從那斷的就從那開始,明確思路就很簡單了。一般有2種方式,一種為服務器端返回,告知我從那開始,還有一種是瀏覽器端自行處理。2種方案各有優(yōu)缺點。本項目使用第二種。

思路:已文件HASH為key值,每個切片上傳成功后,記錄下來便可。若需要續(xù)傳時,直接跳過記錄中已存在的便可。本項目將使用Localstorage進行存儲,這里我已提前封裝好addChunkStorage、getChunkStorage方法。


存儲在Stroage的數(shù)據(jù)




緩存處理

在切片上傳的axios成功回調(diào)中,存儲已上傳成功的切片


instance.post('fileChunk', formData, )

 .then(res => {

   // 存儲已上傳的切片下標

+ this.addChunkStorage(chunkData[index].fileHash, index);

   handler();

 })

在切片上傳前,先看下localstorage中是否存在已上傳的切片,并修改uploaded


   async handleUpload(resume) {

+      const getChunkStorage = this.getChunkStorage(tempFilesArr[i].hash);

     tempFilesArr[i].chunkList = fileChunkList.map(({ file }, index) => ({

+        uploaded: getChunkStorage && getChunkStorage.includes(index), // 標識:是否已完成上傳

+        progress: getChunkStorage && getChunkStorage.includes(index) ? 100 : 0,

+        status: getChunkStorage && getChunkStorage.includes(index)? 'success'

+              : 'wait' // 上傳狀態(tài),用作進度狀態(tài)顯示

     }));


   }

構(gòu)造切片數(shù)據(jù)時,過濾掉uploaded為true的


async uploadChunks(data) {

 var chunkData = data.chunkList;

 const requestDataList = chunkData

+    .filter(({ uploaded }) => !uploaded)

   .map(({ fileHash, chunk, fileName, index }) => {

     const formData = new FormData();

     formData.append('md5', fileHash);

     formData.append('file', chunk);

     formData.append('fileName', index); // 文件名使用切片的下標

     return { formData, index, fileName };

   })

}

垃圾文件清理

隨著上傳文件的增多,相應的垃圾文件也會增多,比如有些時候上傳一半就不再繼續(xù),或上傳失敗,碎片文件就會增多。解決方案我目前想了2種

前端在localstorage設置緩存時間,超過時間就發(fā)送請求通知后端清理碎片文件,同時前端也要清理緩存。

前后端都約定好,每個緩存從生成開始,只能存儲12小時,12小時后自動清理

以上2中方案似乎都有點問題,極有可能造成前后端因時間差,引發(fā)切片上傳異常的問題,后面想到合適的解決方案再來更新吧。

Done: 續(xù)傳到這里也就完成了。


秒傳

這算是最簡單的,只是聽起來很厲害的樣子。原理:計算整個文件的HASH,在執(zhí)行上傳操作前,向服務端發(fā)送請求,傳遞MD5值,后端進行文件檢索。若服務器中已存在該文件,便不進行后續(xù)的任何操作,上傳也便直接結(jié)束。大家一看就明白

async handleUpload(resume) {

   if (!this.container.files) return;

   const filesArr = this.container.files;

   var tempFilesArr = this.tempFilesArr;


   for (let i = 0; i < tempFilesArr.length; i++) {

     const fileChunkList = this.createFileChunk(

       filesArr[tempFilesArr[i].index]

     );


     // hash校驗,是否為秒傳

+      tempFilesArr[i].hash = await this.calculateHash(fileChunkList);

+      const verifyRes = await this.verifyUpload(

+        tempFilesArr[i].name,

+        tempFilesArr[i].hash

+      );

+      if (verifyRes.data.presence) {

+       tempFilesArr[i].status = fileStatus.secondPass;

+       tempFilesArr[i].uploadProgress = 100;

+      } else {

       console.log('開始上傳切片文件----》', tempFilesArr[i].name);

       await this.uploadChunks(this.tempFilesArr[i]);

     }

   }

 }

 // 文件上傳之前的校驗: 校驗文件是否已存在

 verifyUpload(fileName, fileHash) {

   return new Promise(resolve => {

     const obj = {

       md5: fileHash,

       fileName,

       ...this.uploadArguments //傳遞其他參數(shù)

     };

     instance

       .post('fileChunk/presence', obj)

       .then(res => {

         resolve(res.data);

       })

       .catch(err => {

         console.log('verifyUpload -> err', err);

       });

   });

 }

Done: 秒傳到這里也就完成了。

后端處理

文章好像有點長了,具體代碼邏輯就先不貼了,除非有人留言要求,嘻嘻,有時間再更新

Node版

請前往 https://github.com/pseudo-god... 查看

JAVA版

下周應該會更新處理

PHP版

1年多沒寫PHP了,抽空我會慢慢補上來

待完善

切片的大小:這個后面會做出動態(tài)計算的。需要根據(jù)當前所上傳文件的大小,自動計算合適的切片大小。避免出現(xiàn)切片過多的情況。

文件追加:目前上傳文件過程中,不能繼續(xù)選擇文件加入隊列。(這個沒想好應該怎么處理。)

更新記錄

組件已經(jīng)運行一段時間了,期間也測試出幾個問題,本來以為沒BUG的,看起來BUG都挺嚴重

BUG-1:當同時上傳多個內(nèi)容相同但是文件名稱不同的文件時,出現(xiàn)上傳失敗的問題。


預期結(jié)果:第一個上傳成功后,后面相同的問文件應該直接秒傳


實際結(jié)果:第一個上傳成功后,其余相同的文件都失敗,錯誤信息,塊數(shù)不對。


原因:當?shù)谝粋€文件塊上傳完畢后,便立即進行了下一個文件的循環(huán),導致無法及時獲取文件是否已秒傳的狀態(tài),從而導致失敗。


解決方案:在當前文件分片上傳完畢并且請求合并接口完畢后,再進行下一次循環(huán)。


將子方法都改為同步方式,mergeRequest 和 uploadChunks 方法





BUG-2: 當每次選擇相同的文件并觸發(fā)beforeUpload方法時,若第二次也選擇了相同的文件,beforeUpload方法失效,從而導致整個流程失效。

原因:之前每次選擇文件時,沒有清空上次所選input文件的數(shù)據(jù),相同數(shù)據(jù)的情況下,是不會觸發(fā)input的change事件。


解決方案:每次點擊input時,清空數(shù)據(jù)即可。我順帶優(yōu)化了下其他的代碼,具體看提交記錄吧。


<input

 v-if="!changeDisabled"

 type="file"

 :multiple="multiple"

 class="select-file-input"

 :accept="accept"

+  οnclick="f.outerHTML=f.outerHTML"

 @change="handleFileChange"/>

重寫了暫停和恢復的功能,實際上,主要是增加了暫停和恢復的狀態(tài)





之前的處理邏輯太簡單粗暴,存在諸多問題。現(xiàn)在將狀態(tài)定位在每一個文件之上,這樣恢復上傳時,直接跳過即可





封裝組件

寫了一大堆,其實以上代碼你直接復制也無法使用,這里我將此封裝了一個組件。大家可以去github下載文件,里面有使用案例 ,若有用記得隨手給個star,謝謝!

偷個懶,具體封裝組件的代碼就不列出來了,大家直接去下載文件查看,若有不明白的,可留言。


組件文檔

Attribute

參數(shù) 類型 說明 默認 備注

headers Object 設置請求頭

before-upload Function 上傳文件前的鉤子,返回false則停止上傳

accept String 接受上傳的文件類型

upload-arguments Object 上傳文件時攜帶的參數(shù)

with-credentials Boolean 是否傳遞Cookie false

limit Number 最大允許上傳個數(shù) 0 0為不限制

on-exceed Function 文件超出個數(shù)限制時的鉤子

multiple Boolean 是否為多選模式 true

base-url String 由于本組件為內(nèi)置的AXIOS,若你需要走代理,可以直接在這里配置你的基礎(chǔ)路徑

chunk-size Number 每個切片的大小 10M

threads Number 請求的并發(fā)數(shù) 3 并發(fā)數(shù)越高,對服務器的性能要求越高,盡可能用默認值即可

chunk-retry Number 錯誤重試次數(shù) 3 分片請求的錯誤重試次數(shù)

Slot

方法名 說明 參數(shù) 備注

header 按鈕區(qū)域 無

tip 提示說明文字 無

后端接口文檔:按文檔實現(xiàn)即可

藍藍設計www.gerard.com.cn )是一家專注而深入的界面設計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網(wǎng)站建設 平面設計服務






日歷

鏈接

個人資料

藍藍設計的小編 http://www.gerard.com.cn

存檔

主站蜘蛛池模板: 亚洲av禁18成人毛片一级在线 | 四虎在线免费视频 | 亚洲第一综合网站 | 婷婷丁香色综合狠狠色 | 成人字幕 | 亚洲欧美黄色片 | 妺妺窝人体色www在线小说 | 国产69av| 中文无码人妻有码人妻中文字幕 | 99视频一区 | 日韩免费a | 久久综合九色综合网站 | 欧美草b | 夜夜躁狠狠躁日日躁 | 精品国产乱码久久久久久精东 | 国产哺乳奶水91porny | av首页在线| 国产原创视频 | 中文字幕人乱码中文字 | 久久久久久国产精品mv | 国产91精品高清一区二区三区 | 欧美大片在线播放 | 最新av网址在线观看 | 日韩精品视频在线观看免费 | 777爽死你无码免费看一二区 | 天天拍夜夜爽 | 橘梨纱av一区二区三区在线观看 | 男人下部进女人下部视频 | 懂色av中文在线 | 国精产品一二三区传媒公司 | 一色一性一乱一交一视频 | 亚洲 欧美 日韩系列 | av无码久久久久不卡网站下载 | 欧美不卡二区 | 污免费在线观看 | 久久二区三区 | 乌克兰少妇xxxx做受 | 日韩在线影视 | 成人黄色片免费 | 精品视频免费久久久看 | 正在播放精彩绝伦对白 | 曰本一级黄色片 | 成人天堂视频第一网站 | 美女视频黄色在线观看 | 久久久精品久久久 | 国产aaaaa毛片 | 亚洲精品白浆高清久久久久久 | 神宫寺奈绪一区二区三区 | 激情影音 | 成人免费无码大片a毛片软件 | 嫩草影院在线视频 | 亚洲不卡在线播放 | 性做爰视频免费播放大全 | 人善交video高清 | 男女爽爽爽视频 | 天堂一级片 | 91精品久久久久久久久不卡 | 日韩有码专区 | 久久久精品小视频 | 国产卡一卡二卡三无线乱码新区 | 亚洲色成人网站www永久四虎 | 亚洲三级欧美 | 欧美粗暴se喷水 | 香蕉一区二区 | 91视频合集 | 丰满少妇高潮在线观看 | 国产精品免费久久久久久久久久中文 | 夜夜添狠狠添高潮出水 | 日本一区二区观看 | 国产精品高潮呻吟久久av黑人 | 99在线看| 东北少妇伦xxxxhd | 在线观看国产一级片 | 国产精品永久免费 | 久久精品国产亚卅av嘿嘿 | 国产在线资源站 | 九色一区 | 日韩视频一区二区在线观看 | 中文字幕人妻丝袜乱一区三区 | 亚洲精品乱码久久久久蜜桃 | a级毛片在线免费 | 久久综合给合久久狠狠狠97色 | 97色吧 | 九七伦理97伦理手机 | 成人小视频在线看 | 亚洲精品国产第一综合99久久 | 日日夜夜一区二区 | 成年性午夜免费视频网站 | 精品人妻无码一区二区三区 | 91香蕉视频官网 | 免费a级片视频 | 一级免费片 | 日本一区二区三区精品视频 | 最近中文字幕免费mv视频7 | 另类欧美日韩 | 久久精品视频在线看 | 懂色av影视一区二区三区 | blacked精品一区国产在线观看 | 污污免费在线观看 | 欧美aa一级片| 麻豆久久久9性大片 | 樱桃视频一区二区三区 | 欧美91精品久久久久国产性生爱 | 免费黄色视屏 | 久久精品久久久久久久久久久久久 | 九九夜 | 婷婷久久精品 | 成年人看的毛片 | 久久无码人妻一区二区三区 | 久久久欧美国产精品人妻噜噜 | 亚洲国产欧美一区二区三区丁香婷 | 国产无遮挡又黄又爽免费网站 | 国产无遮掩 | 永久免费网站看黄yyy45视频 | 日本性高潮视频 | 岛国av无码免费无禁网站 | 一本色道久久综合亚洲精品不卡 | 在线观看国产福利 | 十八岁以下禁止观看黄下载链接 | 亚洲自拍偷拍精品 | 亚洲情综合五月天 | 精品一区二区三区欧美 | 亚洲成人激情小说 | 一级片久久久久久久 | 天堂视频网 | 亚洲免费影院 | jizz一区| 99久久精品国产亚洲 | 含羞草www国产在线视频 | 在线亚洲精品 | 无码高潮爽到爆的喷水视频app | 精品国产欧美一区二区三区成人 | 成人性生交大片免费看4 | 国产精品视频1区 | 精品99在线 | 亚洲国产97在线精品一区 | 国产在线精品一区二区三区不卡 | 国产大学生粉嫩无套流白浆 | 久久久亚洲国产精品 | 男人的天堂国产 | 国产国语老龄妇女a片 | 爱爱综合| 中文字幕一区二区三区中文字幕 | 国产在线视频www色 日韩精品av一区二区三区 | 在线成人播放 | 日韩一区高清 | 中文字幕 欧美日韩 | www色日本 | 老鸭窝视频在线观看 | 日韩av手机在线 | 黑料福利| 国产精品久久久久久久久久久久 | 日韩人妻系列无码专区 | 免费看黄色大片 | 国产人久久人人人人爽 | av片免费看 | 国产精品无码av天天爽播放器 | 色婷婷精品久久二区二区蜜臂av | 欧美在线视频你懂的 | 国产成人免费在线 | 毛片免费视频在线观看 | 中文字幕久热精品视频在线 | 青青久久国产 | 精品久久久久久久国产性色av | 性xxxx| 欧美xxxx精品另类 | 大肉大捧一进一出好爽视频mba | 国产精品久久久久9999鸭 | 毛片网站在线观看 | 久久久久99精品成人片三人毛片 | 99久久精品免费看国产免费粉嫩 | 欧美变态另类刺激 | 欧美夫妇交换xxxx | 欧美一区二区视频在线 | 黄色片在线免费观看视频 | 97超碰免费观看 | 91亚洲精华国产精华 | 国产亚洲欧美在线视频 | 国产精品苏妲己野外勾搭 | 看特级黄色片 | 人妻夜夜爽天天爽一区 | 伊人久久婷婷五月综合97色 | 在线观看黄色av | h片在线看 | 天海翼一区 | 少妇做爰免费视频网站裸体艺术 | 亚洲成网站 | 国产精品国产三级国产在线观什 | 海角国产乱辈乱精品视频 | 亚洲精品视频免费在线观看 | 综合av在线 | 内射无码专区久久亚洲 | 日本中文字幕网 | 久久久久人妻精品一区三寸蜜桃 | 北条麻妃一区二区免费播放 | 久久国产一级片 | 日韩视频 中文字幕 视频一区 | 欧美性动态图 | 亚洲中文无码a∨在线观看 在线不卡日本v二区到六区 | 医生强烈淫药h调教小说视频 | 国产欧美一级二级三级在线视频 | 青草青草久热精品视频国产4 | 美女啪啪av | 免费无码av片在线观看 | 啪啪福利视频 | 欧美偷拍一区二区 | 草草影院av | 青草福利在线 | 天天天欲色欲色www免费 | 日韩欧美中文字幕在线观看 | 亚洲精品蜜桃久在线 | 国产精久 | 欧美在线视频观看 | 亚洲女同二女同志 | 天天看毛片 | 性欧美精品高清 | 妓女爽爽爽爽爽妓女8888 | 日日摸日日添日日碰9学生露脸 | 亚洲第一网站男人都懂 | 蜜乳av 懂色av 粉嫩av | 羞羞视频在线观看免费观看 | 欧美成人免费一区二区三区 | 在线看污片 | 美女插插视频 | 中文字幕av一区 | 精品国产免费看 | 日韩av在线免费 | 丰满人妻熟妇乱又伦精品软件 | 国产精品国产三级国产av中文 | 亚洲色视频 | 夜夜嗨av色一区二区不卡 | 日韩人妻无码免费视频一区二区三区 | 午夜性刺激免费看视频 | 91福利影院 | 朝鲜美女黑毛bbw | 久视频在线 | 精品蜜桃av | 欧美大片91 | 超碰av在线播放 | 久久久久久久97 | 精品一区二区久久久久久久网站 | 亚洲精品色综合av网站 | 毛片小视频 | 国产午夜视频在线观看 | 竹菊影视欧美日韩一区二区三区四区五区 | 国产精品亚洲综合一区在线观看 | 影音先锋国产资源 | 曰本女人与公拘交酡免费视频 | 国产女主播视频一区二区 | 色呦呦一区| 日本高清一区免费中文视频 | 国产精久久久久久 | 天堂网avav | 久久国产精品免费 | 好吊色欧美一区二区三区视频 | 97国产色呦呦呦夜嗨嗨 | 涩涩一区 | 99看片| 成人综合站 | 少妇人妻av无码专区 | 亚洲毛片网 | 久久久久久逼 | 美国一级黄色毛片 | 日产特黄极日产 | 色综合另类小说图片区 | 丁香婷婷综合激情 | 国产一二三在线视频 | 女同啪啪免费网站www | av污在线观看 | 91精品国产二区在线看大桥未久 | www91com国产91| 国产剧情一区在线 | 一区二区国产视频 | 日韩精品一区二区中文字幕 | 国产热99 | 观看av免费 | 成人网站www污污污网站 | 日韩美女久久 | 日本一区二区三区精品视频 | 在线观看免费黄色 | 日韩极品视频在线观看 | 天天操天天操天天操天天操 | 亚洲中文字幕无码不卡电影 | 欧美xxxx在线 | 越南性受xxx精品 | 欧美成人午夜影院 | 毛片无码一区二区三区a片视频 | 中文字幕在线免费播放 | 国产网友自拍视频 | 寡妇毛片一区二区三区 | 国产91在线观看 | 无码少妇一区二区三区芒果 | 98精品国产 | 国产网红av | 成人影片在线 | 日韩国产欧美一区 | 性饥渴艳妇性色生活片在线播放 | 国产偷窥熟女精品视频大全 | 一线二线三线天堂 | 国产日韩在线免费观看 | 忘忧草在线社区www中国中文 | 一区二区不卡在线 | 亚洲精品一区二区三区香蕉 | 少妇裸体做爰免费视频网站 | 欧美日韩国产成人高清视频 | 特级黄色毛片在放 | 极品女神爆呻吟啪啪 | 99re热这里只有精品视频 | 吃奶呻吟打开双腿做受动态图 | 色偷偷影院 | 亚洲视频123| 色人阁色五月 | 免费观看欧美一级 | 无码人妻一区二区三区精品视频 | 国产精品精品久久久久久 | 免费福利小视频 | 成年女人免费v片 | 久久99亚洲精品久久99 | 亚洲国产精品97久久无色 | 亚洲精品中文字幕乱码三区 | 免费视频www在线观看网站 | 国精产品一二三区传媒公司 | 色偷偷影院 | 熟妇人妻午夜寂寞影院 | 性欧美xxxx精品xxxxrb | 国产女主播在线 | 欧美日韩一级特黄 | 同性恋一级片 | 美女毛片在线 | 亚洲一区精品视频 | 性乡下性大开放 | 日韩成人一区 | 亚洲女同一区二区 | 欧美日韩国产精品自在自线 | 综合网色 | 美腿丝袜亚洲色图 | 香蕉网在线观看 | 色屁屁ts人妖系列二区 | 国产精品视频yjizz免费 | 四虎永久在线精品免费播放 | 水蜜桃无码视频在线观看 | 北条麻妃在线一区二区 | 农村人伦偷精品视频a人人澡 | 亚洲中文字幕无码av | 熟透的岳跟岳弄了69视频 | 日日噜噜夜夜狠狠久久蜜桃 | 日韩视频中文字幕在线观看 | 国产精品自在在线午夜免费 | 手机av免费| 强开小受嫩苞第一次免费视频 | 青青草视频国产 | 隔壁老王国产在线精品 | 色婷婷av99xx| 91精品综合久久久久m3u8 | 福利视频第一页 | 欧美性大战久久久久xxx | 亚洲欧洲日产国码av老年人 | 伊人情人色综合网站 | 你懂的亚洲 | 日韩熟女精品一区二区三区 | 国产欧美精品一区二区色综合 | 欧美 日韩 中文 | 欧美美女破处 | 一区二区三区日韩在线 | 富二代成人短视频 | 国产91对白在线播放 | 无码av免费精品一区二区三区 | 国产全肉乱妇杂乱视频男男 | 免费人成在线观看网站 | 俺去俺来也在线www色官网 | 中文字幕人妻熟女人妻a片 国产精品人妻系列21p | 欧美日本91精品久久久久 | 午夜精品久久久久久久久 | 一级黄色免费毛片 | 色老板精品视频在线观看 | 亚洲综合黄色 | 新婚少妇无套内谢国语播放 | 柠檬福利精品视频导航 | ass极品国模pics| www.日批| 91亚洲国产成人精品一区二区三 | 91精品国产乱码麻豆白嫩 | 欧洲熟妇色xxxx欧美老妇 | 色呦呦在线免费观看 | wwwxxx在线| 国产又粗又猛又爽又黄的视频软件 | 日韩精品在线视频免费观看 | 亚洲一区二区在线视频观看 | 亚洲精品欧美二区三区中文字幕 | 欧美精品二区三区 | 久久久久久毛片精品免费不卡 | 香蕉久久夜色精品升级完成 | 婷婷开心激情网 | 五月婷婷影院 | 欧美三级乱人伦电影 | 在线视频 91 | 欧美jizz19性欧美 | 无码人妻精一区二区三区 | 内谢少妇xxxxx8老少交视频 | 女人真人毛片全免费看 | 天天干,天天爽 | 亚洲欧洲精品成人久久曰 | 交做爰xxxⅹ性爽 | 日韩精品免费一区二区三区竹菊 | 色综合网址 | 狠狠躁夜夜躁人人爽天天 | 不卡国产视频 | 欧美福利片在线观看 | 日韩香蕉网 | 日本丰满护士bbw | 69综合 | 国产一区二区三区在线观看免费 | 亚洲国产日韩a在线播放性色 | 欧美大片在线看免费观看 | 亚洲人成网站在线在线观看 | 亚洲午夜精品久久久久久 | 麻豆视频免费网站 | 激情av综合 | 人人爱人人草 | 国产自在自线2021 | 亚洲精品国产剧情久久9191 | 免费操| 日韩欧美高清视频 | 欧美精品乱码视频一二专区 | 亚洲小说图区综合在线 | 欧美又粗又深又猛又爽啪啪九色 | 久久国产经典 | 国产精品久久999 | 成人在线观看亚洲 | 国产精品久久久久久av福利 | 每日av更新 | 日韩特黄特色大片免费视频 | 摸少妇的奶她呻吟不断爽视频 | 亚洲精品久久夜色撩人男男小说 | 92电影网午夜福利 | 一区二区三区成人久久爱 | 91久| 午夜福利影院私人爽爽 | 大学生精油按摩做爰hd | 蜜桃av噜噜一区二区三区小说 | 亚洲精品久久久久9999吃药 | 欧美成人精品 | 尤物网址在线观看 | a级片久久| 国产成人在线看 | 国内av片 | 一区二区三区播放 | 亚洲国产极品 | 国产精品呻吟久久av凹凸 | 99久在线观看 | 亚州毛片 | 99麻豆久久久国产精品免费 | 富婆如狼似虎找黑人老外 | 成人乱人乱一区二区三区软件 | 欧美精品久久天天躁 | 欧美午夜视频 | 久操短视频 | 中文字幕涩涩久久乱小说 | 日韩永久免费 | 免费日批网站 | 久久久久久久久淑女av国产精品 | 国产一区二区在线播放视频 | 国产又粗又硬又猛的免费视频 | 久久亚洲国产精品五月天婷 | 97视频在线看 | 国产色视频一区二区三区qq号 | av在线播放网 | 国产亚洲视频在线 | 国产福利小视频在线 | 国产精品呻吟 | 国产精品.xx视频.xxtv | 日本人又黄又爽又色的图片 | 69热在线观看| 日日爽视频 | 天天干天天爱天天射 | 国产乱妇乱子视频在播放 | 九九在线观看高清免费 | 色丁香久久| 蜜桃va| 天天躁日日躁狠狠躁欧美老妇小说 | 内地级a艳片高清免费播放 内谢老女人视频在线观看 嫩草99 | 日韩日韩日韩日韩日韩 | 浪潮av网站 | 免费看毛片基地 | 日韩深夜影院 | 一级黄色片毛片 | 欧美性猛交xxxx乱大交 | 无码福利日韩神码福利片 | 国产日韩欧美日韩 | 亚洲成av人片在www色猫咪 | 亚洲国产精品二区 | 日韩视频中文字幕在线观看 | 99久久亚洲精品无码毛片 | 韩国美女黄色片 | 日韩www.| 欧美精品网站在线观看 | 精品不卡视频 | 国产淫语对白粗口video | 婷婷天天| 最近日本免费观看高清视频 | 日韩欧美视频免费观看 | 在线视频亚洲欧美 | 日日骚视频| 日本精品啪啪一区二区三区 | 白白嫩嫩的美女无套内谢 | 四虎视频国产精品免费入口 | 一区二区三区四区在线视频 | 日本在线观看一区 | gogo西西人体大尺度大胆伊人 | 欧美综合久久久 | 九一成人网| 性视频网址 | 成人免费视频软件网站 | 四虎影库永久在线 | 午夜粉色视频 | 日韩av一区二区在线播放 | 亚洲色婷婷久久精品av蜜桃久久 | 日本在线黄色 | a网址 | 天堂中文在线8 | 日韩av在线影视 | 国产精品丝袜久久久久久不卡 | 无套内谢的新婚少妇国语播放 | 中文久久精品 | 上床视频在线观看 | 国产精品白嫩极品美女视频 | 制中文字幕音影 | 亚洲操片 | 日韩a无v码在线播放免费 | 午夜精品久久久久久中宇牛牛影视 | aa性欧美老妇人牲交免费 | 亚洲精品欧美二区三区中文字幕 | 久久久噜噜噜久久久白丝袜 | 免费视频爱爱太爽了激情 | 午夜三级在线 | 91极品欧美视频 | 欧美成人黄色片 | 亚洲欧美中文字幕5发布 | 无码中文字幕人妻在线一区二区三区 | 无码精品视频一区二区三区 | 中文字幕亚洲日韩无线码 | wwwjizz欧美| 中文字幕av高清片 | 日产欧产美韩系列在线播放 | 日本极品少妇videossexhd 天天躁日日躁狠狠躁av麻豆 | 91女神在线| 成人依依| 92在线观看免费视频日本 | 一区二区三区日韩 | 国产网红福利 | 色妞导航 | 四虎影视永久免费 | 亚洲国产成人久久精品软件 | 在线 | 一区二区三区四区 | 在线播放无码高潮的视频 | 99热在线播放 | 国产精品久久久久久妇女6080 | 玩弄少妇人妻中文字幕 | 天天拍天天射 | 天干夜天天夜天干天在线观看 | 91干视频 | 国产亚洲精品久久久久久牛牛 | 在厨房拨开内裤进入毛片 | 黄色av网| 伊人888| 波多野结衣在线视频免费观看 | 欧美乱大交xxxxx潮喷 | jizz欧美性10 | 人人爽人人爽人人片av | 久久精品女同亚洲女同13 | 国产做爰xxxⅹ高潮69 | 国产成人av在线 | 久久久久高潮 | 日本一区二区在线免费观看 | 少妇高潮惨叫喷水在线观看 | 成人91免费视频 | 久久久久久国产精品免费免费男同 | 一个人在线观看www软件 | 国产精品成人一区二区三区视频 | 国产精品人成在线播放新网站 | av中文在线观看 | 欧美草逼视频 | 国产色视频免费 | 老外一级黄色片 | 视频一区国产 | 国产精品网友自拍 | 国产h视频在线观看 | 欧美日本在线观看 | 成人毛片在线视频 | 欧美性受xxxx黒人xyx性爽 | 亚洲激情久久 | 国产在线视频一区二区三区 | 国产免费无码一区二区三区 | 亚洲熟妇无码一区二区三区 | 国产一级片在线 | 久久久久久久久久久久久久国产 | 国产精品一卡二卡三卡 | 亚洲一区小说 | 久久精品国产亚洲7777 | 国产呻吟对白刺激无套视频在线 | 无线日本视频精品 | 精品国产乱码久久久久久1区2区 | 三级国产在线 | 69视频网 | 精品香蕉99久久久久网站 | 性――交――性――乱 | av片网站| 麻豆免费观看视频 | 国产成人精品免费视频大全 | 国产综合自拍 | 亚洲精品国精品久久99热 | 国产免费看黄 | 99久热 | 噜噜久久噜噜久久鬼88 | 国产精品无码午夜免费影院 |