国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

一個企業(yè)級的文件上傳組件應該是什么樣的

共 13294字,需瀏覽 27分鐘

 ·

2023-02-10 21:21

前言

大廠技術  高級前端  Node進階

點擊上方 程序員成長指北,關注公眾號

回復1,加入高級Node交流群

大家好這里是陽九,一個中途轉行的野路子碼農,熱衷于研究和手寫前端工具.

我的宗旨就是 萬物皆可手寫

新手創(chuàng)作不易,有問題歡迎指出和輕噴,謝謝

本文適合有一定node后端基礎的前端同學,如果對后端完全不了解請惡補前置知識。

廢話不多說,直接進入正題。


我們來看一下,各個版本的文件上傳組件大概都長什么樣

等級功能
青銅-垃圾玩意原生+axios.post
白銀-體驗升級粘貼,拖拽,進度條
黃金-功能升級斷點續(xù)傳,秒傳,類型判斷
鉑金-速度升級web-worker,時間切片,抽樣hash
鉆石-網(wǎng)絡升級異步并發(fā)數(shù)控制,切片報錯重試
王者-精雕細琢慢啟動控制,碎片清理等等

1.最簡單的文件上傳

文件上傳,我們需要獲取文件對象,然后使用formData發(fā)送給后端接收即可

function upload(file){
    let formData = new FormData();
    formData.append('newFile', file);
    
    axios.post(
    'http://localhost:8000/uploader/upload',
    formData, 
    { headers: { 'Content-Type''multipart/form-data' } }
    )
}

復制代碼

2.拖拽+粘貼+樣式優(yōu)化

懶得寫,你們網(wǎng)上找找?guī)彀?網(wǎng)上啥都有,或者直接組件庫解決問題

3.斷點續(xù)傳+秒傳+進度條

文件切片

我們通過將一個文件分為多個小塊,保存到數(shù)組中.逐個發(fā)送給后端,實現(xiàn)斷點續(xù)傳。

image.png
// 計算文件hash作為id
const { hash } = await calculateHashSample(file)
//todo 生成文件分片列表 
// 使用file.slice()將文件切片
const fileList = [];
const count = Math.ceil(file.size / globalProp.SIZE);
const partSize = file.size / count;
let cur = 0  // 記錄當前切片的位置
for (let i = 0; i < count; i++) {

    let item = { 
    chunk: file.slice(cur, cur + partSize), 
    filename`${hash}_${i}`
    };
    
    fileList.push(item);
}
復制代碼

計算hash

為了讓后端知道,這個切片是某個文件的一部分,以便聚合成一個完整的文件。我們需要計算完整file的唯一值(md5),作為切片的文件名。

// 通過input的event獲取到file
<input type="file" @change="getFile">
// 使用SparkMD5計算文件hash,讀取文件為blob,計算hash
let fileReader = new FileReader();

fileReader.onload = (e)=>{
let hexHash = SparkMD5.hash(e.target.result)
console.log(hexHash); 
};
復制代碼

斷點續(xù)傳+秒傳(前端)

我們此時有保存了100個文件切片的數(shù)組,遍歷切片連續(xù)向后端發(fā)送axios.post請求即可 設置一個開關,實現(xiàn)啟動-暫停功能。

如果我們傳了50份,關掉了瀏覽器怎么辦?

此時我們需要后端配合,在上傳文件之前,先檢查一下后端接收了多少文件。

當然,如果發(fā)現(xiàn)后端已經(jīng)上傳過這個文件,直接顯示上傳完畢(秒傳)

// 解構出已經(jīng)上傳的文件數(shù)組 文件是否已經(jīng)上傳完畢 
// 通過文件hash和后綴查詢當前文件有多少已經(jīng)上傳的部分
const {isFileUploaded, uploadedList} = await axios.get(
`http://localhost:8000/uploader/count 
?hash=${hash}         
&suffix=${fileSuffix}
`
)
復制代碼

斷點續(xù)傳+秒傳(后端)

至于后端的操作,就比較簡單了

  1. 根據(jù)文件hash創(chuàng)建文件夾,保存文件切片
  2. 檢查某文件的上傳情況,通過接口返回給前端

例如以下文件切片文件夾

image.png
//! --------通過hash查詢服務器中已經(jīng)存放了多少份文件(或者是否已經(jīng)存在文件)------
function checkChunks(hash, suffix
//! 查看已經(jīng)存在多少文件 獲取已上傳的indexList 
const chunksPath = `${uploadChunksDir}${hash}`;
const chunksList = (fs.existsSync(chunksPath) && fs.readdirSync(chunksPath)) || []; 
const indexList = chunksList.map((item, index) =>item.split('_')[1]) 
//! 通過查詢文件hash+suffix 判斷文件是否已經(jīng)上傳 
const filename = `${hash}${suffix}`
const fileList = (fs.existsSync(uploadFileDir) && fs.readdirSync(uploadFileDir)) || []; 
const isFileUploaded = fileList.indexOf(filename) === -1 ? false : true 

console.log('已經(jīng)上傳的chunks', chunksList.length); 
console.log('文件是否存在', isFileUploaded); 

return { 
    code: 200,
    data: { 
        count: chunksList.length, 
        uploadedList: indexList, 
        isFileUploaded: isFileUploaded
        }
      }
    }
復制代碼

進度條

實時計算一下已經(jīng)成功上傳的片段不就行了,自行實現(xiàn)吧

4.抽樣hash和webWorker

因為上傳前,我們需要計算文件的md5值,作為切片的id使用。

md5的計算是一個非常耗時的事情,如果文件過大,js會卡在計算md5這一步,造成頁面長時間卡頓。

我們這里提供三種思路進行優(yōu)化

抽樣hash(md5)

抽樣hash是指,我們截取整個文件的一部分,計算hash,提升計算速度.

1. 我們將file解析為二進制buffer數(shù)據(jù),

2. 抽取文件頭尾2mb, 中間的部分每隔2mb抽取2kb

3. 將這些片段組合成新的buffer,進行md5計算。

圖解:

image.png

樣例代碼

//! ---------------抽樣md5計算-------------------
function calculateHashSample(file{

    return new Promise((resolve) => {
        //!轉換文件類型(解析為BUFFER數(shù)據(jù) 用于計算md5)
        const spark = new SparkMD5.ArrayBuffer();
        const { size } = file;
        const OFFSET = Math.floor(2 * 1024 * 1024); // 取樣范圍 2M
        const reader = new FileReader();
        let index = OFFSET;
        // 頭尾全取,中間抽2字節(jié)
        const chunks = [file.slice(0, index)];
        while (index < size) {
            if (index + OFFSET > size) {
                chunks.push(file.slice(index));
            } else {
                const CHUNK_OFFSET = 2;
                chunks.push(file.slice(index, index + 2),
                    file.slice(index + OFFSET - CHUNK_OFFSET, index + OFFSET));
            }
            index += OFFSET;
        }
        // 將抽樣后的片段添加到spark
        reader.onload = (event) => {
            spark.append(event.target.result);
            resolve({
                hash: spark.end(),//Promise返回hash
            });
        }
        reader.readAsArrayBuffer(new Blob(chunks));
    });
}
復制代碼

webWorker

除了抽樣hash,我們可以另外開啟一個webWorker線程去專門計算md5.

webWorker: 就是給JS創(chuàng)造多線程運行環(huán)境,允許主線程創(chuàng)建worker線程,分配任務給后者,主線程運行的同時worker線程也在運行,相互不干擾,在worker線程運行結束后把結果返回給主線程。

具體使用方式可以參考MDN或者其他文章

使用 Web Workers \- Web API 接口參考 | MDN \(mozilla.org\)[1]

一文徹底學會使用web worker \- 掘金 \(juejin.cn\)[2]

時間切片

熟悉React時間切片的同學也可以去試一試,不過個人認為這個方案沒有以上兩種好。

不熟悉的同學可以自行掘金一下,文章還是很多的。

這里就不多做論述,只提供思路

時間切片也就是傳說中的requestIdleCallback,requestAnimationCallback 這兩個API了,或者高級一點自己通過messageChannel去封裝。

切片計算hash,將多個短任務分布在每一幀里,減少頁面卡頓。

5.文件類型判斷

  • 簡單一點,我們可以通過input標簽的accept屬性,或者截取文件名來判斷類型
<input id="file" type="file" accept="image/*" />

const ext = file.name.substring(file.name.lastIndexOf('.') + 1);
復制代碼

當然這種限制可以簡單的通過修改文件后綴名來突破,并不嚴謹。

  • 通過文件頭判斷文件類型

我們將文件轉化為二進制blob,文件的前幾個字節(jié)就表示了文件類型,我們讀取進行判斷即可。

比如如下代碼

// 判斷是否為 .jpg 
async function isJpg(file{
  // 截取前幾個字節(jié),轉換為string
  const res = await blobToString(file.slice(03))
  return res === 'FF D8 FF'
}
// 判斷是否為 .png 
async function isPng(file{
  const res = await blobToString(file.slice(04))
  return res === '89 50 4E 47'
}
// 判斷是否為 .gif 
async function isGif(file{
  const res = await blobToString(file.slice(04))
  return res === '47 49 46 38'
}
復制代碼

當然咱們有現(xiàn)成的庫可以做這件事情,比如 file-type 這個庫

file-type \- npm \(npmjs.com\)[3]

6.異步并發(fā)數(shù)控制(重要)

我們需要將多個文件片段上傳給后端,總不能一個個發(fā)送把?我們這里使用TCP的并發(fā)+實現(xiàn)控制并發(fā)進行上傳。

image.png
  1. 首先我們將100個文件片段都封裝為axios.post函數(shù),存入任務池中
  2. 創(chuàng)建一個并發(fā)池,同時執(zhí)行并發(fā)池中的任務,發(fā)送片段
  3. 設置計數(shù)器i,當i<并發(fā)數(shù)時,才能將任務推入并發(fā)池
  4. 通過promise.race方法 最先執(zhí)行完畢的請求會被返回 即可調用其.then方法 傳入下一個請求(遞歸)
  5. 當最后一個請求發(fā)送完畢 向后端發(fā)起請求 合并文件片段

圖解

image.png

代碼

//! 傳入請求列表  最大并發(fā)數(shù)  全部請求完畢后的回調
function concurrentSendRequest(requestArr: any, max = 3, callback: any{
    let i = 0 // 執(zhí)行任務計數(shù)器
    let concurrentRequestArr: any[] = [] //并發(fā)請求列表

    let toFetch: any = () => {
        // (每次執(zhí)行i+1) 如果i=arr.length 說明是最后一個任務  
        // 返回一個resolve 作為最后的toFetch.then()執(zhí)行
        // (執(zhí)行Promise.all() 全部任務執(zhí)行完后執(zhí)行回調函數(shù)  發(fā)起文件合并請求)
        if (i === requestArr.length) {
            return Promise.resolve()
        }

        //TODO 執(zhí)行異步任務  并推入并發(fā)列表(計數(shù)器+1)
        let it = requestArr[i++]()
        concurrentRequestArr.push(it)

        //TODO 任務執(zhí)行后  從并發(fā)列表中刪除
        it.then(() => {
            concurrentRequestArr.splice(concurrentRequestArr.indexOf(it), 1)
        })

        //todo 如果并發(fā)數(shù)達到最大數(shù),則等其中一個異步任務完成再添加
        let p = Promise.resolve()
        if (concurrentRequestArr.length >= max) {
            //! race方法 返回fetchArr中最快執(zhí)行的任務結果 
            p = Promise.race(concurrentRequestArr)
        }
        //todo race中最快完成的promise,在其.then遞歸toFetch函數(shù)
        if (globalProp.stop) { return p.then(() => { console.log('停止發(fā)送') }) }
        return p.then(() => toFetch())
    }

    // 最后一組任務全部執(zhí)行完再執(zhí)行回調函數(shù)(發(fā)起合并請求)(如果未合并且未暫停)
    toFetch().then(() =>
        Promise.all(concurrentRequestArr).then(() => {
            if (!globalProp.stop && !globalProp.finished) { callback() }
        })
    )
}
復制代碼

7.并發(fā)錯誤重試

  1. 使用catch捕獲任務錯誤,上述axios.post任務執(zhí)行失敗后,重新把任務放到任務隊列中
  2. 給每個任務對象設置一個tag,記錄任務重試的次數(shù)
  3. 如果一個切片任務出錯超過3次,直接reject。并且可以直接終止文件傳輸

8.慢啟動控制

由于文件大小不一,我們每個切片的大小設置成固定的也有點略顯笨拙,我們可以參考TCP協(xié)議的慢啟動策略,

. 設置一個初始大小,根據(jù)上傳任務完成的時候,來動態(tài)調整下一個切片的大小, 確保文件切片的大小和當前網(wǎng)速匹配

  1. chunk中帶上size值,不過進度條數(shù)量不確定了,修改createFileChunk, 請求加上時間統(tǒng)計
  2. 比如我們理想是30秒傳遞一個
  3. 初始大小定為1M,如果上傳花了10秒,那下一個區(qū)塊大小變成3M
  4. 如果上傳花了60秒,那下一個區(qū)塊大小變成500KB 以此類推

9.碎片清理

如果用戶上傳文件到一半終止,并且以后也不傳了,后端保存的文件片段也就沒有用了。

我們可以在node端設置一個定時任務setInterval,每隔一段時間檢查并清理不需要的碎片文件

可以使用 node-schedule 來管理定時任務,比如每天檢查一次目錄,如果文件是一個月前的,那就直接刪除把。

垃圾碎片文件

后記

以上就是一個完整的比較高級的文件上傳組件的全部功能,希望各位有耐心看到這里的新手小伙伴能夠融會貫通。每天進步一點點。

參考資料

[1]

https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API/Using_web_workers: https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FAPI%2FWeb_Workers_API%2FUsing_web_workers

[2]

https://juejin.cn/post/7139718200177983524: https://juejin.cn/post/7139718200177983524

[3]

https://www.npmjs.com/package/file-type: https://link.juejin.cn?target=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Ffile-type

- END -

關于本文

作者:不月陽九

https://juejin.cn/post/7187695113597321275

Node 社群


我組建了一個氛圍特別好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你對Node.js學習感興趣的話(后續(xù)有計劃也可以),我們可以一起進行Node.js相關的交流、學習、共建。下方加 考拉 好友回復「Node」即可。

   “分享、點贊在看” 支持一波??

瀏覽 19
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产99热| 亚洲欧洲视频在线观看| 国产九色91回来了| 色伊人| 亚洲精品不卡| 一级电影视频去去去| 91久久人澡人妻人人澡人人爽| 大香蕉伊人成人| 日韩成人无码一区二区视频| 91高清视频| 影音先锋国产资源| 日本一区免费| 三级片视频在线观看| 91久久无码一区人妻A片蜜桃| 无码人妻精品一区二区三区温州 | 人人上人人操| 亚洲日韩一区二区三区四区| 久草蜜臀| 欧美一级a| 久久久久久久久久久高清毛片一级 | 国产AV无| 操逼视频高清无码| 妞干网国产| 夜夜夜操操操| 亚洲AV无码国产精品二区| 狠狠的操| 日韩中文字幕在线视频| 超碰日韩| 国产精品一二三区夜夜躁| 欧美日韩中文字幕| 日韩中文字码无砖| 人人看人人摸人人搞| 国产成人大香蕉| 婷婷色六月| 高潮毛片| 国产91高跟丝袜| 尤物av在线| 91羞射短视频在线观看| 色色网站免费| 日本高清视频九区| 色老板在线观看| 91人妻无码一区二区三区| 国产AV中文字幕| 夜夜操天天操| 古装一级无遮挡A片| 国产精品福利小视频| 麻豆md0049免费| 久热精品在线观看视频| 高清无码在线视频观看| gogogo日本免费观看高清电视剧的注意 | 五月婷婷性爱| 天堂在线视频免费| 国产色秘乱码一区二区三区| 狼人社區91國產精品| 婷婷导航| 色婷婷丁香五月| 日韩无码人妻| 日韩无码精品视频| 成人网在线视频| 无码一区二区三区免费| 中文字幕视频在线| 天堂一区二区三区| 成人免费无遮挡无码黄漫视频| 久久久久久| 三级AV在线| 国产一区二| 婷婷在线综合| 99久久久久久久| 99爱爱| 五月天狠狠操| 国产欧美一区二区三区四区| 激情丁香五月天| 日韩欧美精品在线观看| 成人无码三级| 91香蕉麻豆| 操逼视频无码| 五月婷婷亚洲| 日产毛片| 专区无日本视频高清8| 成人视频一区二区三区| 国产精品久久久久久久久久两年半 | 亚洲第一中文字幕| 免费在线观看黄片视频| 午夜福利AV在线| 北条麻妃一区二区三区在线播放 | 久久六月天| 成人午夜视频精品一区| 北条麻妃精品视频| 亚洲成人77777| 久久久久久久极品内射| 日日干网| 欧美国产操逼| 97超碰资源站| 久久免费视频6| 亚洲天堂男人的天堂| 久久免费在线视频| 青青草手机在线观看| 青青操逼网| 天天操夜| 国产精品成人无码a无码| 中文字幕一区二区6页| 色色色99| 亚洲免费成人| 久久久久成人电影| 国产一区二区三区在线| 在线不卡免费Av| 青草五月天| 毛片av在线| 天堂综合网久久| 成年人免费网站| 久视频在线观看| 久久久久久久免费无码| 亚洲操逼电影| 国产夫妻自拍AV| jizz在线观看| 日韩精品一二三区| 亚洲精品在线视频| 欧美成人一区二区三区| 亚州毛多色色精品| 老司机福利在线视频| 蜜乳AV一区二区三区| 永久免费叼嘿| 91视频网站免费观看| 91探花在线播放| 九九精品99| aa免费视频| 老女人毛片| 青青草99| 日韩欧美在线播放| 丁香五月少妇| www日本色| 深爱五月天| 五月丁香欧美综合| 日韩中文无码字幕| 91超碰免费| 福利久久| 久久国产无码| 国产精品18在线| 韩日高清无码| 亚洲AV国产| 51妺嘿嘿午夜福利视频| 夜夜夜叫天天天做| 99久在线精品99re8热| 在线黄片视频| 黄色成人视频在线观看| 国产免费精彩视频| 五月天激情啪啪| 97久久综合| 蜜臀久久久99久久久久久久| 婷婷五月一区| 另类图片亚洲色图| 神马午夜福利| 免费观看高清无码视频| 欧美一级高清片免费一级a| 日韩免费视频一区| 国产一级片网站| 东京热无码免费视频| 国产传媒在线观看| 91人妻人人澡人人爽人人精品 | 欧美操逼在线观看| 久久一| 久草久| 好叼操| 国产色天使| 日日夜夜超碰| 欧美日韩字幕| 牛牛精品一区二区| 九色PORNY国产成人| 国产黄色免费网站| 欧美区在线观看| 午夜久久福利| 在线观看视频亚洲| 国产在线无码视频| 亚洲无码高清在线观看| 西西444大胆无码视频| 丁香婷婷在线| 黄片视频在线| 操比片| 婷婷三区| 婷婷黄色电影| 国产黄片在线播放| 水蜜桃视频在线| 香蕉91视频| 91亚洲国产| 亚洲AV综合色区无码国产播放| 俺去也俺去啦| 男人资源网| 奇米色色色| 国产精品一区二区三区四区| 韩国三级无码| 最近最经典中文MV字幕| 小黄片在线看| 神马午夜福利视频| 国产毛片欧美毛片高潮| 中文字幕+乱码+中文乱码91在线观看 | 欧美日韩高清无码| 亚洲群交| 国产美女被| 国产黄片一区二区| 台湾成人在线| 五月丁香综合网| 亚洲黄色视频免费| 成年人黄色在线观看| www九九热| www超碰| 91亚洲精品久久久久蜜桃| 激情五月婷婷网| 三级网站视频| www.天天操| 五月丁香啪啪啪| 黄色毛片在线播放| 色吧| 欧美人妻视频| 中文字幕系列| 蜜臀久久精品久久久久| 五月丁香999| 久久精品视频免费| 久久久久久久久久久久久久久久久久免费精品分类视频 | 亚洲日韩视频| 北条麻妃视频在线| 少妇搡BBBB搡BBB搡打电话| 色色网欧美| 97超碰网| 免费无码婬片AAAA片老婦| 亚洲中文字幕码mv| 日本三级片在线| 在线观看中文字幕无码| 安微妇搡BBBB搡BBBB| 欧美在线黄色| 欧美高清国产| 少妇搡BBBB搡BBB搡HD(| 军人妓女院BD高清片在线播放| 驲韩在线视频免费观看| 草久在线| 亚洲自拍网站| 精产国品一区二区三区| 伊人网av| 亚州精品人妻一二三区| 亚洲色在线视频| 国产精品V日韩精品V在线观看| 超碰人人91| 一本在线| 国产精品男女| 国产性爱网站| 日本国产在线观看| 欧美精品99| 无套内射免费视频| 中文字幕日韩成人| 五月婷婷av| 无码视频韩国| 成人午夜av| 人人操人人草| 黄频免费观看| 日韩久久婷婷| 99爱在线观看| 色狠狠网| 国产青草视频| 丁香av| A级片黄色片| 成人做爰黄A片免费看| 天天艹夜夜艹| 在线国产黄色| 亚洲第一大网站| 北条麻妃无码在线播放| 国产又黄又大又粗的视频| 草草视频在线观看| 亚洲最大成人网站| 日韩中文字幕一区二区| 北条麻妃无码一区二区| 精品人妻一区二区三区在| 日韩无码精品一区| 91精品久久久久久粉嫩| 日韩午夜欧美精品一二三区| 美女做爱视频网站| 亚洲女人被黑人巨大进入| 一二三区| 黄色电影视频网站| 人妻在线观看| 99久久人妻无码中文字幕系列 | 天天操夜夜爽| 一区二区三区四区无码在线| 九色PORNY蝌蚪视频| 2025av中文字幕| 成功精品影院| 成人午夜福利网站| 91视频美女| 亚洲涩情91日韩一区二区| 无码22p| 91视频网站免费| 成人H动漫精品一区二区三区蘑菇 高清无码视频在线免费观看 | 东京热三区| 4虎亚洲人成人网www| 亚洲vs无码秘蜜桃| 蜜桃av秘无码一区二区| 特级西西444www| 51精品国产| 草逼美女| 无码福利导航| 尤物视频在线播放| 亚洲AV无码成人精品区久| 日本精品码喷水在线看| 久久精品无码一区二区无码性色| 午夜精东影业传媒在线观看| 丰满人妻一区二区三区视频在线不卡| 国产九九九九九九| 884aa四虎影成人精品一区| 97成人精品| 在线免费看AV| 无码任你操| 在线看国产| 91久久影院| 色婷婷五月天在线观看| 国产无套进入免费| 黄总AV| 透逼视频| 四虎看片| 四川少妇BBB| 成人网站中文字幕| 九九99精品| 一区二区三区麻豆| 久久一二三区| 亚洲国精产品| 一道本无码一区| 日韩在线中文字幕亚洲| 毛片久久久| 日韩在线观看免费| 免费69视频看片| 日本一区二区三区在线观看| xxxxxbbbbb| 足浴小少妇-88AX| 国产精品囯产三级囯产AV野外| 韩国一级av| 夜夜天天人人| 色综合一区| 天天射天天干天天| 一本一道无码免费看视频| 中国少妇xxx| 色网站在线观看| 丁香五香天堂| AAAAA毛片| 五月亚洲六月婷婷| 亚洲无码成人网| 欧美久久一区二区三区四区视频 | 97资源在线| 亚洲成年网| 激情网页| 中文字幕超清在线观看| 高清无码视频网站| 久艹大香蕉| www.三级| 亚洲天堂男人天堂| 婷婷色网| 探花在线综合| 五月天青青草超碰免费公开在线观看 | av一区在线观看| 69成人网| 日韩中文字幕av在线| 精品蜜桃一区二区三区| 黄色在线视频观看| 人人爱人人摸| 中文字幕手机在线视频| 精品字幕| 在线免费看黄色视频| 手机AV免费| 中文字幕不卡视频| 在线观看一区二区视频| 中文字幕人成人乱码亚洲电影| 午夜无码免费| 大香蕉精品视频| 9I成人免费版视频| 清清草视频| 中文字幕av免费在线观看| 欧美黄片网站| 福利国产在线| 国产一区二区免费看| 日本99热| 免费观看黄色一级片| 国产在线观看一区二区| 北条麻妃亚洲无码| 精品欧美无人区乱码毛片| 亚洲无码一区在线| 巨乳国产一区| 婷婷久久网| 亚洲日韩一区二区三区四区| 少妇搡BBBB搡BBB搡造水爽 | 91一级A片在线观看| 岛国av免费| 国产免费久久久| 欧美黄色片| 欧美1区2区| 三上悠亚一区二区| 中文字幕观看在线| 亚洲一区高清无码| 中文字幕不卡+婷婷五月| 黄色一级片免费观看| 丁香五月少妇| 在线免费毛片| 亚洲福利社| 欧美三级网| 黄在线| 91无码视频在线观看| 东京热av在线| 成年人免费毛片| 国产成人在线播放| 久久免费在线视频| 亚洲国产成人精品激情在线| 少妇在线| 天天操天天日天天射| 亚洲婷婷三级成人网| 久操视频在线观看免费| 蜜桃无码视频小说网站| 囯产精品宾馆在线精品酒店 | 91网站免费看| 亚洲无码高清免费| 日本一区二区三区在线观看| 久久久久久婷婷| YOUjiZZ欧美大全| 九九热在线观看| 国产精品丝袜| 人妻超碰在线| 日韩成人在线免费观看| 成人午夜天堂| 褒姒AV无玛| 一区二区视频在线| 精品国精品自拍自在线| 五月天黄色电影| 老婆中文字幕乱码中文乱码 | 亚洲国产电影| 鸡巴在线观看| 中文字幕人妻无码| 中国特级毛片| 亚洲AV一二三| 免费看黃色AAAAAA片| 成人精品免费无码毛片| 国产视频一区二区在线| jjzz亚洲| 91免费网站在线观看| 久久伊人春色| 俺去啦在线| 国产午夜精品一区二区三区牛牛| 性做久久久久久| 97A片在线观看播放| 国产成人综合在线| 亚洲天堂av在线免费观看| 波多野结衣亚洲| 婷婷五月天性爱| 丰满少妇一级片| 成人无码区免费AV毛片| 激情五月婷婷色| 国产超碰免费| 免费看操逼视频| 男人av在线| 黄页网站视频| 国产午夜福利电影| 久久久久久久精| 99久久丫e6| 尹人香蕉久久| 国产精品A片守望| 91大神在线观看入口| 黄片免费无码| 亚洲最大黄色| 无码日韩视频| 少妇厨房愉情理伦BD在线观| 朝鲜性感AV在线| 久久99精品久久久水蜜桃| 三级黄片网站| 伊人久久大香色综合久久| 中文字幕中文字幕| 91丨九色丨熟女新版| 综综综综合网| av大香蕉| 国产妞干网| 亚洲GV成人无码久久精品| 久久理论电影| 成人一级A片| 青青青草视频在线观看| 日本无码精品| 九九九九精品视频| 操碰视频| 亚洲精品久久久蜜桃| 久久婷婷五月丁香| 性爱AV在线观看| 2025中文字幕| 成人综合网站| 免费国产黄色视频网站| 中文字字幕中文字幕乱码| 另类图片亚洲色图| 欧美A片在线播放| 99久久亚洲精品日本无码| 色色色色色色色色欧美| 狠狠干狠狠撸| 裸体美女视频欧美18| 蜜桃一区| 久久黄色免费看| 成人午夜福利网站| 日本在线视频一区二区| 成人综合在线观看| 国产美女18毛片水真多| 亚洲日韩一区二区| 18禁网站禁片免费观看| 亚洲欧美久久久| 婷色五月| 伊人网站| 91麻豆精品传媒国产| 麻豆md0049免费| 精品在线播放视频| 婷婷视频网站| 亚洲精品三级| 欧美动态视频| 在线免费看黄网站| 国产日韩一区二区三免费高清| 亚洲天堂av在线观看| 91偷拍视频| 久久丝袜视频| 777三级| 日韩3级片| 欧美午夜精品久久久| 亚洲成人无码电影| 国产精品在线观看视频| 国产精品天天狠天天看| 亚洲最新在线观看| 91爱爱com| 爽好紧别夹喷水网站| 日韩精品久久久久久久酒店| 三级黄色免费网站| 岛国免费视频| 被男友内S~高H文| 9I成人免费版| 日本成人精品| 超碰在线无码| 高清视频一区| 3D精品啪啪一区二区三区| 国产激情欧洲在线观看一区二区三区 | jizz日韩| 黄色AV电影| 大香焦草久| 无码不卡视频| 国产在线视频你懂的| 西西人体大胆裸体A片| 九七精品| 免费爱爱视频网站| 欧美aaaaaa| 人人摸人人草| 国产91无码精品秘入口新欢| 久久久久久久精| 99久久夜色精品国产亚洲| 午夜在线无码| 国产精品无码乱伦| 色人阁人妻中文字幕| 8050午夜网| 狠狠五月| 国产原创精品| 人人做人人操| 日本一级特级毛片视频| 婷婷丁香五月花| 大香蕉亚洲成人| 男女操逼网站| 婷婷五月丁香网| 日韩经典无码| 丁香五月天社区| 中文字幕乱码无码人妻系列蜜桃| 操逼视频91| 青青草视频免费看| 亚洲福利视频电影精| 黄色视频网站在线| 午夜黄色福利| 男人AV在线| 久久综合五月天| 中文字幕人妻在线中文乱码怎么解决 | 免费在线a| 亚洲中文字幕免费观看| 无码人妻系列| 一本久久精品一区二区| 国产噜噜噜噜久久久久久久久| 日本久久成人| 免费观看成人毛片A片直播千姿| 996视频| 日韩无码网| 婷婷色色五月天| 2021无码| 亚洲加勒比在线| 思思热在线观看视频| 日韩一区二区三| 黄色毛片在线| 蜜臀av网| 91精品午夜少妇| 午夜免费福利视频| 国产A级黄色片| 国产一级a毛一级a毛片视频黑人| 日韩成人电影| 黄色精品视频| 免费高清无码视频| 真实国产乱子伦毛片| 免费观看黄色电影| 国内自拍无码| 人人妻人人玩人人澡人人爽| 亚洲高清超级无码在线视频观看| 在线观看无码高清视频| 五月天色婷婷丁香| 精品字幕| 性欧美成人18| 波多野结衣无码AV在线| 欧美在线色图| 中文字幕Av在线| 亚洲美女在线观看| AA丁香综合激情| 欧美日韩亚洲一区二区| 日韩AV无码一区二区| 人人妻人人操人人干| 国产一精品一aⅴ一免费| 欧美日韩成人在线| 91最新网址| 亚洲性爱无码| 亚洲AV无码成人精品区| 亚洲AV无码乱码国产精品蜜芽| 久久在线免费视频| 影音先锋av无码| 五月婷婷激情五月| 丁香五月激情在线| 一本色道综合久久欧美日韩精品| 影音先锋无码专区| 爱爱视频免费网站| 欧美一级特黄真人做受| 亚洲乱码在线| 日韩无码三级视频| 黄色激情av| 日韩AV免费网站| 日韩人妻精品一区二区| 操美女一区二区| 欧美韩日| 性色a| 九九九在线观看视频| 人妻无码中文久久久久专区| 极品美女扒开粉嫩小泬高潮一| 天堂在线视频| 日韩操逼视频| 91AV视频| 日韩东京热中文字幕| 国产av高清| 国产三级片在线观看| 青青在线| 中文字幕免费观看| 日韩免费高清| 91视频在线观看| 亚洲中字幕新| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 波多野结衣视频一区| 四虎在线视频| 91AV无码| 91福利在线视频| 久久丁香五月| 青青草在线播放| 北条麻妃无码播放| 一本一道无码免费看视频| 日韩欧美午夜成人无码| 久久91欧美特黄A片| 国产婷婷色一区二区在线观看| 91丨国产丨精品丨丝袜| 国产欧美性爱| AV无码免费观看| 亚洲毛片在线观看| 亚洲成人av在线| 免费国产黄色| 五月天婷婷激情| 91精东传媒果冻传媒| 亚洲无码电影在线观看| 人人摸人人草| 天天操嫩逼无套视频| 一区二区三区操逼| 日韩乱轮小说与视频| 黄网免费看| 亚洲视频1区| 欧美日韩国产三级| 狠狠搞狠狠操| 亚洲高清视频在线播放| 荫蒂添到高潮免费视频| 三级黄色免费网站| 人妻无码一区二区三区| 三级片网站在线观看| 人人看人人爱| 久久婷婷综合网| 亚洲精品无码视频在线观看| 夜夜爽天天爽| 狠狠操AV| 精品二区| 久草在线| 午夜成人福利视频在线观看 | 久久免费视频观看| 熟女人妻人蜜桃视频| 中文字幕在线免费观看视频| 在线免费看黄色| 一级色色片| 成人手机看片| 久久久无码AV| 动漫无码视频| 蜜臀久久99精品久久久久久婷婷| 91人妻人人澡人人爽人妻| 九色PORN视频成人蝌蚪自拍 | 无码日韩视频| 天堂在线中文| 一个色综合网| 亚洲天堂在线免费观看| 中文字幕在线免费看| 2025最新偷拍| 欧美A级黄片| 无码色网| 成人A片在线| 日韩欧美国产精品综合嫩V| 免费在线观看黄视频| 精品国产AⅤ麻豆| 日韩无码网址| 国产精品一级| 激情人妻在线| 日本成人免费电影| 美女高潮网站| 国内不卡一卡二视频| 熟妇女人妻丰满少妇中文字幕| 国产操美女| 99视频精品在线| 91香蕉在线| 91视频在线观看网| 五月天丁香成人| 日日干网| 日韩成人免费在线观看| 中文字幕高清无码在线观看| 欧美一級黃色A片免費看| 中文字幕日韩在线观看| 99免费视频在线观看| 美女黄色视频永费在线观看网站| 一区二区高清无码视频| 无码秘蜜桃一区二区三区| 中文字幕第72页| 波多野结衣视频一区| 四川少扫搡BBBBB搡B| 韩国成人啪啪无码高潮| 国产无套进入免费| 天天日夜夜撸| 国产精品女人777777| 亚洲精品一区二区三区无码电影| 亚洲爆乳无码一区二区三区| 日逼网站免费观看| 自拍偷拍综合| 欧美丝袜脚交xxxxBH| 先锋影音亚洲AV每日资源网站| 无码免费毛片| 黄色视频免费国产| 亚洲午夜在线观看| 亚洲色图在线视频| 婷婷久久综合| 青青草婷婷| 久久电影精品| www.91com| 四虎精品成人无码A片| 強姦婬片A片AAA毛片Mⅴ| 人妻无码一二三区免费| 国产无遮挡又黄又爽又| 欧美污视频在线观看| 婷婷综合亚洲| 91在线看片| 在线免费观看黄色| 狠狠狠久久久| www.青草视频| 最新中文字幕av| 日韩一级高清| 欧美成人无码片免费看A片秀色| 日韩情色片| 亚洲国产精品成人综合色在线婷婷 | 91夫妻交友视频| 人妻少妇精品视频一区二区三区 | 国产c区| 亚洲成人娱乐网| 五月丁香中文字幕| 亚洲AV无码一区二区三竹菊| 亚洲日韩国产中文字幕| 亚洲一区久久| 欧美成人精品激情在线视频| 久久99深爱久久99精品| 中文字幕乱伦日本| 无码欧美人XXXXX日本无码| 免费内射| 人妻无码久久| 中文字幕三区| 伊人久久大香色综合久久| 玖玖爱这里只有精品| 九九在线观看视频| 欧美成人精品一区二区三区| 亚洲精品欧美久久婷婷| 国产超级无码高清在线视频观看 | 国产乱子伦-区二区| 激情五月俺也去| 人妻天天干| 亚洲无码不卡| 国产人妻人伦精品一区| 人人操狠狠操| 国产一级婬乱片AV片AAA毛片| 亚洲黄片免费看| 日韩一级一片| 先锋成人电影| 老婆被黑人杂交呻吟视频| 亚洲爱爱视频| 日韩人妻无码一区二区三区中文| 97在线免费| 亚洲天堂男人的天堂| 人妻骚逼| 日韩AV在线直播| 成人18视频| 99Re66精品免费视频| 国产精品扒开腿做爽爽爽A片唱戏| 亚洲欧洲无码在线| 先锋影音资源一区| 亚洲天堂无码高清| 日韩在线视频播放| 蜜桃久久久久久久| 91在线免费播放| 澳门毛片| 97色综合| 婷婷五月天成人社区| 亚洲AV秘成人久久无码海归| 美女黄色视频网站| 黄色大片AV在线| 亚洲午夜久久| 九九福利| 大香蕉操逼视频| 天天色天天干天天| 免费看日逼视频| 免费在线看a| 国产无套在线| 午夜福利在线播放| 欧美久久精品| 麻豆久久| 午夜成人无码视频| 国产亚洲久一区二区三区| 日本精品视频在线观看| 日本亚洲欧洲免费| 呦小性Free小U女HD| 西西西444www无码视| 国产一区二区做爱| 特级特黄AAAA免费看| A国产| 91久久国产综合久久91| 人妻少妇精品视频一区二区三区| 中文字幕在线观看日本| 日韩三级在线| 9191久久| 日本黄色毛片| 911亚洲精品| 四川妇搡BBBB搡BBBB| 久久精品国产亚洲AV成人婷婷| 中文字幕一区二区久久人妻| 日韩人妻午夜| 在线观看视频你懂的| 亚洲国产精品久久| 青草五月天| 三级黄色免费网站| 大荫蒂HD大荫蒂视频| 欧美不卡在线视频| 色天堂污| 91免费看| 北条麻妃精品青青久久价格| 激情五月伊人| 波多野成人无码精品69| 婷婷五月天在线电影| 9久9久9久9久女女女女| 国产精品TV| 99久久久久久久无码| 天天日天天操天天摸天天干天日射天天插 | 超碰天天干| 久久久国产一区二区三区| 国产精品无码在线播放| 苍井空二区| 级婬片AAAAAAA免费| 91肏屄视频| 日本黄色视频在线观看| 伊人免费视频在线观看| 欧美日韩中文| 无码视频在线| 免费一区视频| 日韩欧美毛片| 日韩一级片子| 亚洲欧美不卡| 日本免费一级片| 91老熟| 怡春院亚洲| 韩国无码视频| 欧美不卡一区二区| 在线免费观看毛片| 在线看操逼| 欧美伊人在线| 精品欧美一区二区三区| 91大神在线免费观看| 国产aⅴ激情无码久久久无码 | 午夜无码人妻AV大片| 懂色成人视频在线观看| 伊香蕉大综综综合| 国产传媒在线观看| 欧美三区四区| 亚洲狼人天堂| 婷婷草逼| 农村三级片| 成人黄色毛片|