久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Vue 3大文件秒傳實(shí)戰(zhàn):文件指紋與分片上傳詳解

Vue 3大文件秒傳實(shí)戰(zhàn):文件指紋與分片上傳詳解 1. 項(xiàng)目概述1.1 核心需求解析大文件秒傳這個(gè)詞做過文件上傳的人都繞不過去。最早聽到這類需求通常是產(chǎn)品經(jīng)理或者老板甩過來一句你看某某網(wǎng)盤傳大文件一下子就傳完了咱們也得做到。但實(shí)際上所謂秒傳并不是網(wǎng)絡(luò)快而是壓根沒傳文件本身——只在服務(wù)器上做了一次文件指紋比對(duì)發(fā)現(xiàn)文件已經(jīng)存在就直接把新記錄掛到那個(gè)已有文件上前端跳過了上傳等待看起來就像秒傳。這篇文章要做的就是用 Vue 3 HTML5 的 File API 組合從零寫一個(gè)帶文件指紋計(jì)算、秒傳校驗(yàn)、分片上傳、斷點(diǎn)續(xù)傳的 DEMO后端用 Node.js 簡(jiǎn)化模擬不依賴任何付費(fèi)服務(wù)。整個(gè)項(xiàng)目跑起來之后你把這個(gè)文件傳給 App 端或者別的 Web 項(xiàng)目核心邏輯都是通用的。這個(gè) DEMO 解決的核心問題有三個(gè)用戶上傳 1GB 以上文件時(shí)HTTP 請(qǐng)求直接傳整個(gè)文件容易超時(shí)、容易斷而且瀏覽器內(nèi)存扛不住。上傳中斷后從頭再來浪費(fèi)帶寬和時(shí)間體驗(yàn)極差。公司內(nèi)網(wǎng)里多人傳同一個(gè)安裝包、鏡像文件服務(wù)器上明明已經(jīng)有了還每次都重新傳一遍浪費(fèi)磁盤也浪費(fèi)網(wǎng)絡(luò)。這套東西適合誰來參考后端同學(xué)想給前端提供上傳接口時(shí)先了解前端行為前端同學(xué)想搞明白秒傳原理、分片策略以及對(duì)前端為什么能算出一個(gè)很大的文件哈希值感到好奇的初學(xué)者。我按實(shí)際落地的思路走代碼會(huì)逐步拆清楚。1.2 技術(shù)選型思路選 HTML5 而不是 Flash 或客戶端插件核心原因是 HTML5 把文件操作能力直接下沉到了瀏覽器標(biāo)準(zhǔn)層。你不需要安裝任何東西一個(gè) input[typefile] 就能拿到 File 對(duì)象File 對(duì)象有 size、type 這些屬性有 slice() 方法做文件切片配合 FileReader 可以讀文件內(nèi)容配合 Web Worker 可以做耗時(shí)計(jì)算不卡頁面。Vue 這邊主要是做狀態(tài)管理、UI 渲染和請(qǐng)求編排。用 Vue 3 的 Composition API 處理上傳任務(wù)的生命周期會(huì)比 Vue 2 舒服很多——watch、computed、reactive 這套東西處理多任務(wù)進(jìn)度是天然契合的。模板編譯也快調(diào)試方便。我曾經(jīng)見過一個(gè)項(xiàng)目用原生 JavaScript 手寫上傳隊(duì)列狀態(tài)分散在各個(gè)全局變量里后期加需求改得崩潰。用 Vue 來管理上傳狀態(tài)屬于用對(duì)了工具它不是為上傳而生但響應(yīng)式狀態(tài)管理確實(shí)讓多文件上傳、進(jìn)度更新、任務(wù)取消這類邏輯變得直觀。2. 秒傳設(shè)計(jì)背后的原理拆解2.1 什么才算真正的秒傳現(xiàn)在很多項(xiàng)目號(hào)稱支持秒傳實(shí)現(xiàn)方式五花八門但真正經(jīng)得起推敲的做法是基于文件摘要比對(duì)。流程很簡(jiǎn)單前端選中文件。前端計(jì)算整個(gè)文件的 MD5 或 SHA-1 摘要哈希值。將摘要 文件大小發(fā)送給后端。后端在數(shù)據(jù)庫 / 文件系統(tǒng)索引里查詢是否存在相同摘要 相同大小的文件。如果存在則返回文件已存在前端直接顯示上傳完成跳過后面的上傳過程。如果不存在前端再走分片上傳流程。這里有兩個(gè)必須一起比的維度摘要和大小。只比摘要理論上也夠但哈希碰撞的可能性雖然低疊加上大小比對(duì)可以把誤判概率壓到幾乎為零。同時(shí)這種做法也方便后端做快速篩掉明顯不同的文件減輕摘要檢索壓力。有人會(huì)問MD5 不是已經(jīng)不安全了嗎在秒傳場(chǎng)景里MD5 不是做加密而是做內(nèi)容指紋攻擊者不會(huì)刻意構(gòu)造一個(gè) MD5 碰撞來上傳惡意文件因?yàn)槲募?nèi)容服務(wù)器會(huì)原樣保存不涉及防篡改場(chǎng)景。當(dāng)然如果項(xiàng)目安全意識(shí)極強(qiáng)可以升級(jí)到 SHA-256代價(jià)是性能略低但對(duì)大文件計(jì)算來說差別不大。2.2 秒傳為什么離不開分片只有秒傳還不夠。如果文件確實(shí)不存在你是做不到秒傳的得要老老實(shí)實(shí)上傳。這時(shí)就要考慮怎么把大文件安全高效地傳完。直接一次性 POST 整個(gè)文件在幾百 MB 以內(nèi)勉強(qiáng)能玩但上了 GB 級(jí)別就全是問題瀏覽器內(nèi)存被大 File 對(duì)象撐爆其實(shí) File 對(duì)象有點(diǎn)特殊它是引用磁盤/內(nèi)存中的數(shù)據(jù)不一定會(huì)一次性把整個(gè)文件讀進(jìn) JS 堆但你如果構(gòu)造 FormData 塞一個(gè)超大文件網(wǎng)絡(luò)層就要處理整段數(shù)據(jù)。網(wǎng)絡(luò)閃斷導(dǎo)致請(qǐng)求失敗一切從頭再來。后端接口接收超大 body超時(shí)設(shè)置、內(nèi)存限制都要調(diào)Nginx 默認(rèn)client_max_body_size才 1MB生產(chǎn)環(huán)境忘了改就直接 413。進(jìn)度條只有沒開始和完成兩個(gè)狀態(tài)體驗(yàn)極度糟糕。分片上傳把大文件切成比如 5MB、10MB 的小塊逐塊上傳這樣每塊請(qǐng)求都在一個(gè)合理的網(wǎng)絡(luò)范圍內(nèi)失敗后只需要重傳那一塊。而且多個(gè)分片可以并發(fā)上傳整個(gè)上傳速度往往比單線程傳大文件更快。這是秒傳和分片在我這個(gè) DEMO 中的關(guān)系秒傳負(fù)責(zé)不傳分片負(fù)責(zé)怎么傳先秒傳后分片。2.3 前端計(jì)算大文件指紋的難點(diǎn)計(jì)算整個(gè)文件 MD5 需要把文件內(nèi)容從頭到尾讀取一遍。FileReader 一次讀一個(gè)切片然后通過 SparkMD5 庫的 append 方法逐步累積哈希計(jì)算狀態(tài)最后 end() 得到最終摘要。這里有個(gè)性能問題4GB 的文件如果在前端主線程里切分成幾千個(gè)分片循環(huán)讀取計(jì)算瀏覽器會(huì)卡頓到像死機(jī)一樣用戶會(huì)以為網(wǎng)頁崩了。我之前第一次實(shí)現(xiàn)時(shí)就是這么干的用戶反饋一選文件就白屏。后來改成 Web Worker 之后再大的文件計(jì)算期間 UI 依然能操作進(jìn)度條照常動(dòng)畫體驗(yàn)好了幾個(gè)量級(jí)。流程變成主線程把 File 對(duì)象交給 Worker。Worker 內(nèi)部通過 File 對(duì)象的 slice 讀取分片逐片交給 SparkMD5。Worker 每計(jì)算完一個(gè)分片通過 postMessage 通知主線程更新進(jìn)度。全部完成后 postMessage 返回最終 MD5。注意一點(diǎn)File 對(duì)象是可以直接傳給 Web Worker 的不需要通過結(jié)構(gòu)化的拷貝把整個(gè)文件數(shù)據(jù)拿過來瀏覽器底層用引用傳遞處理這個(gè)所以不用擔(dān)心內(nèi)存翻倍。3. 前端工程落地Vue 3 HTML5 實(shí)現(xiàn)一個(gè)可運(yùn)行 DEMO3.1 環(huán)境準(zhǔn)備與項(xiàng)目初始化這一步?jīng)]什么高深的就按 Vue 官方推薦的 Vite 來。我假設(shè)你已經(jīng)裝了 Node.js 18。npm create vuelatest模板選的時(shí)候只需要勾選JSX和Vue Router就好其他 Test、Lint 看自己習(xí)慣。項(xiàng)目初始化的目的是快速跑起來一個(gè)最小 Vue 3 工程接下來在 App.vue 和新建的 Worker 文件里寫核心代碼。如果不想用腳手架也可以用 CDN 方式在單 HTML 里引 Vue 3但那樣 Worker 文件和模塊組織會(huì)比較別扭DEMO 還是用工程化方式更貼近真實(shí)項(xiàng)目。3.2 核心代碼結(jié)構(gòu)我的 DEMO 文件結(jié)構(gòu)如下├── index.html ├── package.json ├── src │ ├── App.vue │ ├── components │ │ └── UploadPanel.vue │ ├── utils │ │ ├── fileHash.js # 負(fù)責(zé)與 Worker 通信 │ │ ├── fileHash.worker.js # 真正計(jì)算 MD5 的地方 │ │ └── uploader.js # 分片上傳核心邏輯 │ └── api │ └── uploadApi.js # 后端接口封裝每個(gè)文件的職責(zé)要理清楚別把 Worker 邏輯和 Vue 組件混在一起后期改起來會(huì)很頭疼。我見過不少初學(xué)者把 Worker 的代碼寫成字符串用 Blob 動(dòng)態(tài)創(chuàng)建雖然能跑但調(diào)試很痛苦還是物理文件清晰。3.3 前端代碼全解UploadPanel.vue組件要做的事文件選擇顯示文件信息調(diào)起秒傳校驗(yàn)觸發(fā)分片上傳展示進(jìn)度先看組件的核心邏輯部分template div classupload-panel input typefile changeonFileChange / div v-iffile p文件名{{ file.name }}/p p文件大小{{ formatSize(file.size) }}/p div v-ifhashProgress 0 正在計(jì)算文件指紋{{ hashProgress }}% /div div v-else-ifuploadProgress 0 上傳進(jìn)度{{ uploadProgress }}% /div button clickstartUpload :disableduploading開始上傳/button /div /div /template script setup import { ref } from vue; import { getFileHash } from ../utils/fileHash; import { checkExist, uploadChunk, mergeChunks } from ../api/uploadApi; const file ref(null); const hashProgress ref(-1); // -1 表示未開始 const uploadProgress ref(-1); const uploading ref(false); const fileMd5 ref(); const chunkSize 5 * 1024 * 1024; // 每片 5MB function onFileChange(e) { const selected e.target.files[0]; if (!selected) return; file.value selected; hashProgress.value -1; uploadProgress.value -1; } async function startUpload() { if (!file.value) return; uploading.value true; // 第一步計(jì)算文件指紋 fileMd5.value await getFileHash(file.value, (p) { hashProgress.value p; }); hashProgress.value 100; // 第二步秒傳校驗(yàn) const exist await checkExist(fileMd5.value, file.value.size); if (exist) { uploadProgress.value 100; uploading.value false; alert(文件已在服務(wù)器上秒傳成功); return; } // 第三步分片上傳 const chunks Math.ceil(file.value.size / chunkSize); let uploaded 0; for (let i 0; i chunks; i) { const start i * chunkSize; const end Math.min(start chunkSize, file.value.size); const blob file.value.slice(start, end); await uploadChunk({ fileMd5: fileMd5.value, chunkIndex: i, chunk: blob, }); uploaded; uploadProgress.value Math.round((uploaded / chunks) * 100); } // 第四步通知后端合并分片 await mergeChunks({ fileMd5: fileMd5.value, fileName: file.value.name }); uploading.value false; alert(上傳完成); } function formatSize(size) { if (size 1024 * 1024) return (size / 1024).toFixed(2) KB; return (size / (1024 * 1024)).toFixed(2) MB; } /script這段代碼把流程串起來了但說實(shí)話第一次寫別按這個(gè)直接上由于await uploadChunk是串行的效率偏低。我在后面 3.5 小節(jié)會(huì)給出一個(gè)并發(fā)控制版本的思路DEMO 先保證邏輯正確再談性能。fileHash.worker.js的核心代碼import SparkMD5 from spark-md5; self.onmessage function (e) { const { file, chunkSize } e.data; const spark new SparkMD5.ArrayBuffer(); const reader new FileReaderSync(); const chunks Math.ceil(file.size / chunkSize); let currentChunk 0; try { while (currentChunk chunks) { const start currentChunk * chunkSize; const end Math.min(start chunkSize, file.size); const buffer reader.readAsArrayBuffer(file.slice(start, end)); spark.append(buffer); currentChunk; self.postMessage({ type: progress, percent: Math.round((currentChunk / chunks) * 100), }); } self.postMessage({ type: done, md5: spark.end(), }); } catch (err) { self.postMessage({ type: error, message: err.message }); } };注意這里用了FileReaderSync在 Worker 里它是可以同步讀取文件的天然適合這種循環(huán)切片的邏輯代碼比異步回調(diào)清晰得多。瀏覽器兼容性方面現(xiàn)代瀏覽器對(duì) Worker 里的 FileReaderSync 支持沒問題。fileHash.js負(fù)責(zé)創(chuàng)建 Worker 并做 Promise 封裝export function getFileHash(file, onProgress) { return new Promise((resolve, reject) { const worker new Worker(new URL(./fileHash.worker.js, import.meta.url), { type: module, }); worker.postMessage({ file, chunkSize: 5 * 1024 * 1024 }); worker.onmessage (e) { const { type, percent, md5, message } e.data; if (type progress) { onProgress onProgress(percent); } else if (type done) { worker.terminate(); resolve(md5); } else if (type error) { worker.terminate(); reject(new Error(message)); } }; }); }這里用import.meta.url的方式引入 Worker 是 Vite 的標(biāo)準(zhǔn)做法打包時(shí)瀏覽器會(huì)自己處理 Worker 的資源路徑問題。uploadApi.js是后端接口封裝。注意分片上傳的請(qǐng)求頭要加Content-Type: application/octet-stream如果傳 FormData 也可以但二進(jìn)制流更干凈import axios from axios; const BASE_URL http://localhost:3000; export function checkExist(fileMd5, fileSize) { return axios .post(${BASE_URL}/exists, { fileMd5, fileSize }) .then((res) res.data.data.exists); } export function uploadChunk({ fileMd5, chunkIndex, chunk }) { const formData new FormData(); formData.append(chunk, chunk); formData.append(fileMd5, fileMd5); formData.append(chunkIndex, chunkIndex); return axios.post(${BASE_URL}/upload, formData, { headers: { Content-Type: multipart/form-data }, }); } export function mergeChunks({ fileMd5, fileName }) { return axios .post(${BASE_URL}/merge, { fileMd5, fileName }) .then((res) res.data); }3.4 為什么要把 chunkSize 定為 5MBchunkSize 的選擇是有講究的不是隨便拍的。太小的分片比如 256KB分片數(shù)量暴增請(qǐng)求次數(shù)太多HTTP 握手開銷壓過傳輸收益后端也要處理海量元數(shù)據(jù)。太大的分片比如 100MB單請(qǐng)求耗時(shí)太長(zhǎng)失敗重試代價(jià)大而且瀏覽器內(nèi)存占用高。5MB 是業(yè)界比較通用的值7Zip 官方在分卷壓縮時(shí)也常用 5MB 級(jí)別的塊大小。對(duì)于普通的企業(yè)內(nèi)網(wǎng)帶寬5MB 大約 1-3 秒傳完一片用戶感知進(jìn)度會(huì)平滑更新。我實(shí)際測(cè)過 10MB 分片在千兆內(nèi)網(wǎng)沒問題但公網(wǎng)上就反而容易出現(xiàn)單片超時(shí)。200MB 視頻有 40 片每片重試一次也就是多 40 個(gè)請(qǐng)求可接受。3.5 并發(fā)上傳與斷點(diǎn)續(xù)傳升級(jí)DEMO 里的串行上傳在文件特別大時(shí)耗時(shí)較長(zhǎng)但可以簡(jiǎn)單改造為并發(fā)控制。思路是維護(hù)一個(gè)任務(wù)池限定同時(shí)進(jìn)行 3-5 個(gè)上傳請(qǐng)求async function uploadChunksWithConcurrency(file, fileMd5, chunks, limit 3) { const tasks Array.from({ length: chunks }, (_, i) i); const pool new Set(); let uploadedCount 0; for (const index of tasks) { if (pool.size limit) { await Promise.race(pool); } const p uploadSingleChunk(file, fileMd5, index).then(() { pool.delete(p); uploadedCount; uploadProgress.value Math.round((uploadedCount / chunks) * 100); }); pool.add(p); } await Promise.all([...pool]); }斷點(diǎn)續(xù)傳需要后端支持查詢哪些分片已經(jīng)上傳過前端在開始上傳前請(qǐng)求一下已上傳分片列表只傳沒傳過的。這個(gè)邏輯在 DEMO 里我留作擴(kuò)展點(diǎn)后面 4.2 會(huì)展開講實(shí)現(xiàn)方式。4. 后端配合用 Node.js 實(shí)現(xiàn)最小可行服務(wù)前端代碼再花哨后端不支持也是白搭。這個(gè) DEMO 的后端我用 Express 寫了最簡(jiǎn)版本存儲(chǔ)用本地磁盤 一個(gè) JSON 文件做元數(shù)據(jù)記錄。4.1 Express 后端接口實(shí)現(xiàn)const express require(express); const multer require(multer); const fs require(fs); const path require(path); const app express(); app.use(express.json()); const UPLOAD_DIR path.join(__dirname, uploads); const META_FILE path.join(__dirname, meta.json); const storage multer.diskStorage({ destination: (req, file, cb) { const chunkDir path.join(UPLOAD_DIR, req.body.fileMd5); if (!fs.existsSync(chunkDir)) { fs.mkdirSync(chunkDir, { recursive: true }); } cb(null, chunkDir); }, filename: (req, file, cb) { cb(null, ${req.body.chunkIndex}); }, }); const upload multer({ storage }); function readMeta() { if (!fs.existsSync(META_FILE)) return {}; return JSON.parse(fs.readFileSync(META_FILE, utf-8)); } function writeMeta(meta) { fs.writeFileSync(META_FILE, JSON.stringify(meta, null, 2)); } app.post(/exists, (req, res) { const { fileMd5, fileSize } req.body; const meta readMeta(); const record meta[fileMd5]; res.json({ data: { exists: !!(record record.size fileSize), }, }); }); app.post(/upload, upload.single(chunk), (req, res) { res.json({ code: 0, message: chunk received }); }); app.post(/merge, (req, res) { const { fileMd5, fileName } req.body; const chunkDir path.join(UPLOAD_DIR, fileMd5); const chunks fs.readdirSync(chunkDir); chunks.sort((a, b) a - b); const dest path.join(UPLOAD_DIR, fileName); const fd fs.openSync(dest, w); for (const chunk of chunks) { const chunkPath path.join(chunkDir, chunk); const data fs.readFileSync(chunkPath); fs.writeSync(fd, data); } fs.closeSync(fd); const meta readMeta(); meta[fileMd5] { size: fs.statSync(dest).size }; writeMeta(meta); res.json({ code: 0, message: merge done }); }); app.listen(3000, () { console.log(server running at http://localhost:3000); });這個(gè)后端的核心思路/exists做秒傳判斷看 meta.json 里是否有相同文件指紋記錄。/upload把分片保存到以 fileMd5 為名的目錄下文件名就是分片序號(hào)。/merge把所有分片按序號(hào)拼回原文件更新元數(shù)據(jù)。只跑 DEMO 的話完全夠用。真實(shí)項(xiàng)目里需要把 meta 換成 Redis MySQL磁盤存儲(chǔ)換成對(duì)象存儲(chǔ)OSS / MinIO分片合并也可以放到異步隊(duì)列里做不能在請(qǐng)求里同步合成幾百 MB 的文件。4.2 已上傳分片查詢與補(bǔ)傳機(jī)制斷點(diǎn)續(xù)傳的核心是前端要知道哪些分片上傳過了。后端加一個(gè)接口app.get(/chunks/:fileMd5, (req, res) { const chunkDir path.join(UPLOAD_DIR, req.params.fileMd5); if (!fs.existsSync(chunkDir)) { res.json({ data: { uploadedChunks: [] } }); return; } const chunks fs.readdirSync(chunkDir).map(Number); res.json({ data: { uploadedChunks: chunks } }); });前端拿到uploadedChunks后在分片上傳循環(huán)里直接跳過已存在的序號(hào)。進(jìn)度計(jì)算也要基于當(dāng)前累計(jì)已上傳數(shù)來做不能從 0 開始。5. 常見問題與排查技巧實(shí)錄5.1 計(jì)算哈希時(shí)瀏覽器卡死現(xiàn)象選了一個(gè) 2GB 的文件頁面直接白屏鼠標(biāo)都動(dòng)不了。原因FileReader 逐片讀取文件是在主線程執(zhí)行的循環(huán)幾萬次切片操作會(huì)持續(xù)占用渲染進(jìn)程。解決把哈希計(jì)算扔進(jìn) Web Worker。如果已經(jīng)用了 Worker 還卡檢查是不是你把fileHash.js里的 Worker 實(shí)例重復(fù)創(chuàng)建了或者你的 Worker 里又 require 了大模塊。我之前見過一個(gè)同事寫了 Worker但每次分片都 new 一個(gè) SparkMD5 實(shí)例內(nèi)存炸了也是卡。5.2 秒傳校驗(yàn)通過但文件遲遲不出現(xiàn)在目標(biāo)路徑現(xiàn)象前端拿到了秒傳成功提示但服務(wù)器上找不到文件。原因元數(shù)據(jù)記錄在了 meta.json但文件本身可能在第一次上傳之后被清理了或者是 merge 接口只更新了 meta沒有真正把分片拼裝成文件。解決/exists 判斷時(shí)不僅要查 meta 記錄還要校驗(yàn)?zāi)繕?biāo)文件是否真的存在于磁盤const destPath path.join(UPLOAD_DIR, fileName); const fileExists fs.existsSync(destPath); res.json({ data: { exists: !!record record.size fileSize fileExists } });注意 fileName 不要直接用用戶傳來的原始名有路徑穿越風(fēng)險(xiǎn)應(yīng)當(dāng)用哈希重命名存儲(chǔ)。5.3 分片合并后文件內(nèi)容損壞現(xiàn)象上傳完成后打開文件提示格式損壞或者 MD5 校驗(yàn)不通過。原因大概率是分片合并順序有問題。Node 的fs.readdirSync返回順序不一定是文件名的數(shù)字順序比如字符串排序會(huì)把 10 排在 2 前面導(dǎo)致合并錯(cuò)亂。解決合并前必須先按數(shù)字排序const chunks fs.readdirSync(chunkDir).sort((a, b) parseInt(a) - parseInt(b));這是一個(gè)非常經(jīng)典的坑。任何時(shí)候合并分片都要顯式排序別依賴文件系統(tǒng)返回順序。5.4 超大文件上傳時(shí)后端報(bào)錯(cuò) 413 Payload Too Large現(xiàn)象本地開發(fā)跑得好好的放到 Nginx 后面就失敗。原因Nginx 默認(rèn)client_max_body_size是 1MB分片雖然只有 5MB但也會(huì)被攔下來。解決在 Nginx 配置里顯式聲明client_max_body_size 10m;如果你后續(xù)調(diào)大分片這個(gè)值跟著調(diào)大就行。如果服務(wù)器上有網(wǎng)關(guān)層也需要檢查網(wǎng)關(guān)的請(qǐng)求體大小限制。5.5 前后端聯(lián)調(diào)時(shí) CORS 報(bào)錯(cuò)本地用 Vite5173去請(qǐng)求后端3000端口瀏覽器會(huì)攔截跨域響應(yīng)。在后端加上const cors require(cors); app.use(cors());DEMO 階段直接放開所有來源沒毛病生產(chǎn)環(huán)境再按域名白名單收緊。6. 實(shí)操心得與擴(kuò)展建議6.1 從 DEMO 到生產(chǎn)級(jí)上傳組件你還需要補(bǔ)什么這個(gè) DEMO 跑通之后距離生產(chǎn)環(huán)境還有一些距離我列一下優(yōu)先級(jí)比較高的增強(qiáng)點(diǎn)上傳任務(wù)持久化刷新頁面之后已傳分片還能查到續(xù)傳不丟。接入文件流加密敏感場(chǎng)景下分片內(nèi)容要做 AES 加密再上傳服務(wù)端解密落盤。后端摘要二次校驗(yàn)分片合并完成后后端重新計(jì)算 MD5和前端傳過來的 fileMd5 比對(duì)能發(fā)現(xiàn)傳輸過程中被篡改或損壞的問題。進(jìn)度展示優(yōu)化結(jié)合請(qǐng)求耗時(shí)、網(wǎng)絡(luò)吞吐預(yù)估剩余時(shí)間而不是只顯示百分比。拖拽上傳與文件夾上傳HTML5 的 DataTransfer 接口可以輕松實(shí)現(xiàn)視覺體驗(yàn)提升很大。并發(fā)閾值自適應(yīng)根據(jù)網(wǎng)絡(luò)環(huán)境動(dòng)態(tài)調(diào)整并發(fā)數(shù)弱網(wǎng)時(shí)降低并發(fā)避免大量重試。6.2 一個(gè)容易踩的坑文件重復(fù)上傳時(shí)的重復(fù)合并你可能會(huì)遇到這種情況用戶第一次上傳時(shí)中斷了第二次點(diǎn)開始上傳秒傳校驗(yàn)沒通過服務(wù)端沒記錄完整文件走分片上傳但是服務(wù)端已經(jīng)殘留了一部分分片。如果后端合并接口不檢查已有分片是否存在可能重復(fù)執(zhí)行 merge把兩個(gè)不完整的文件拼在一起。我的做法是 merge 之前先檢查目標(biāo)文件是否已經(jīng)存在如果存在且 size 等于記錄值直接返回成功。如果 size 不一致則先刪除殘留分片目錄再?gòu)牧汩_始傳保證分片干凈。6.3 最后分享一個(gè)小技巧很多大文件上傳場(chǎng)景會(huì)碰到用戶等不到計(jì)算哈希完成就關(guān)頁面的問題。我的經(jīng)驗(yàn)是在哈希計(jì)算階段就開始做用戶引導(dǎo)比如顯示正在分析文件請(qǐng)勿關(guān)閉頁面同時(shí)把哈希計(jì)算的粒度調(diào)得細(xì)一些比如 2MB 一片進(jìn)度條能更快動(dòng)起來用戶就不會(huì)以為卡死了。還有一個(gè)細(xì)節(jié)對(duì)體驗(yàn)影響很大秒傳成功后建議給一個(gè)動(dòng)畫反饋比如打勾或者彈一層遮罩玩家心理上會(huì)有這么快就完成了的驚喜感。續(xù)傳、并發(fā)控制的完整代碼其實(shí)在這個(gè) DEMO 基礎(chǔ)上加不了多少但生產(chǎn)工程里每一步都要考慮到異常處理和資源釋放這塊值得你花時(shí)間好好打磨。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
秋霞免费无码视频日韩A片| 中文字幕丰满子伦无码专区在线视频最新 | 人人爱人人操人人性| 欧美熟女操屄| 乱伦av.com| 99免费在线视频| 久99| 国产有码一区| 亚洲资源网| 国产亚热在线久久| 天天综合~91| 操逼片国产| 婷婷AV一区二区三区| 99色色网| 性生活无遮挡纯毛片在线看| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 91人妻人人澡人人爽人人精品| 97超碰精品图片| 国产女大学生AV| 人妻日日夜夜精品| 蜜臀久久99精品久久久老,,| 殴美牲| 手机看片1024你懂的国产| 九九久久久九九| 亚洲素人综合| 欧美五十路熟| 久久五月天婷婷丁香中文字幕| 97欧美色| 怡红院成人视频| 天天看特黄的免费网站| 国产suv精品一区二区四区999| 欧美黄片视频在线观看免费 | 婷婷五月天激情四射| 中文字幕乱偷人妻久久艾草网| 色香阁在线| 久久婷婷影院| 天天日日夜夜| 婷婷五月天补不补| 精品超碰中文在线| 1956日韩精品| 国产乱弄免费在线视频。| 色婷婷综合久久久久中文一区二区| 亚洲丝袜二区| 婷婷三区| 嫩草伊人久久精品| 99热18这里只有精品| 天堂资源站| 97av,com| 国产97色在线| WWW.操逼.COM| 搡老熟女免费视频 | 日韩精品99999| 天天摸,夜夜摸| 啊啊啊好爽快点啊啊啊嗯嗯| 麻豆视频test| 亚欧美色图| 欧美BT 亚洲色图| 欲香欲色综合天天伊人| 国产亚洲福利第一页丝袜| 人人性爱视频免费| 成人麻豆av电影网站| 欧美精品日韩久久久九| 91精品无码人妻系列| 日本Xx性爱| 婷婷五月天av| 久久超碰、| 69久久久久久久久久久久久| 超碰九7免费| 国产福利一区二| 国产福利在线视频网站| 99精品视频在线观看| 大香蕉在线视频15| 亚洲欧美一区二区不卡视频播放| 日本不卡免费二区| 亚洲欧洲综合成人av一区| 欧美强奸一区二区诱惑| 天美传媒在线一区| 久久久久久999| 热无码中文亚洲H一道本一区二区| 户外裸露刺激视频第一区| 丁香六月婷婷久久综合| 97色色国产视频| 高颜值美女口爆高潮浪叫| 人人操人人色网| 国产成人免费观看在线视频| 欧美色997| 97在线日韩中文字幕| 牛牛AV人人夜夜澡人人爽| 午夜福利免费福利视频| 极品后入免费视频| 99re超碰| 九九99精品| 第二页中文字幕| 中文字幕免费在线观看| 美国人人操人人操| 国产精品久久9| 日韩欧视频| 思思热免费在线视频| 久久久人体| 伊人午夜福利视频| 51一区二区三区| 夜夜嗷嗷一区二区| 久久男人精品| 九九色色| 夜夜嗨一区二区三区直播内容| 国产av强奸美女| 蜜桃精久三区| 另类TS人妖一区二区三区| 亚洲欧洲偷拍一区| 人妻丝袜一区二区三区在线| 久久人妻四季| 操国产高清| 67914亚洲精品| 大香蕉日韩欧美| 亚洲精品一二区| 色婷婷成人综合| 久久久四区| 欧亚在线视频| 伊人九九| 资源在线观一 二| 欧美精品亚洲精品日韩传电影| 神马九九| 天天色香欲综合网| V A在线| 欧美黄页| 东北黄色电影| 曰韩人妻中文字幕在线| 精品一区96| 国产免费小视频| 怡春苑东京热| 欧美18 在线观看| 99精品视频在线观看免费| 国产精品午夜福利亚洲综合网| 国语av最新自产拍在线观看| 亚洲天堂电影网| 91岛国动作片| 国产夫妻一区二区| 99久久久er直播网址| 97久久久网站| 国产久久一区二区| 91精品综合久久久久久五月丁香| 久久午夜色播影院免费高清| 中文字幕88av在线| 黄片www.| 性爱网站一区二区| 极品少妇久久久久| 亚洲中文字幕噜噜噜久久久| 老熟女乱子伦中文字幕一区二区| 伊人性在线视频| 久久国色天香香蕉| 国产精品人妻熟女aⅴ| 亚洲小说视频| 91美女视频直播| 欧美片第一页| 久久日韩肥臀| 中文字幕av一区二区三区人妻少妇| 强奸乱亚洲| 亚洲色图大香| 久久久久幕乱码| 狠狠中文字幕| 国产v片在线免费观看| 欧美精品二区视频在线| 性色AV蜜色av色欲av| 97在线亚洲| 亚洲综合69| 内射黑人| 国产久久一区二区三区野外在线| 亚洲国男人的天堂| 亚洲精品久久久久久久久豆丁网| 91爱做| 天天欧美| 日日骚网站| 西西美女视频网| 一本久道久久综合狠狠爱| 亚洲无吗在线视频| 日本性爰一道本| 一级性爱网| 蜜臀99久久精品久久久懂爱| 在线观看不卡一区二区三区| a片久久久久久久久久久久 | 乱伦AVxx| 色播综合| 亚洲天堂,男人| 91影视亚洲| 欧美在线第五页| 97超级久久| 澳门黄片一香蕉视频| 91久久青青草原精品| 欧美精品成人一区二区在线观看 | 欧美一级黄片免费播放| 久久久久免费少妇| 大香蕉操久久| 国产免费一区| 国产在线综合福利网站| 欧美激情五月天| 综精品久久久aaaa| 日1区2区3区2020| 国产一级作爱毛片| 日本丝袜美腿人妻九九| 91欧美另类| 噜噜噜噜久久久精品免费| 少妇熟女视频一区二区三区| 欧美精品成人一区二区在线观看 | 色波多| 精品久热| 欧美丝袜中文字幕07在线| 亚洲精品国产专区在线观看| 狼人久草| 久久人妻熟女一区二区| 九热视频| 久久99干一本高清| 操逼日韩无码 | 天天插夜夜操| 天天影视网色欲色香| 福利操逼| 日本熟妇自慰性高潮一区二区三区| 秋霞 色色| 色色婷婷五月天| 欧美日韩久久精品爱爱| 97青青操视频| 国产综合操逼高清| 色色97爱| 99操碰| 中文字幕第95页| 久久精品国产亚洲AV嘿嘿| 国产精品经典一卡久久久| 天天综合网91| 国产25页| 午夜精品久久久久久久99蜜桃一| 中文字幕在线第二页| 在线视频日韩欧美国产| 综合第一页| 五月天伊人| 亚洲第一狼人丝袜美女另类| 无码二级三级| 性欧美精| 九九久久国产精品| 怡红院亚洲怡春院av| 韩国成人精品久久久免费看| 视频二区美腿制服人妻欧美| 99热在线不卡| 97色色色| 久久亚洲AV无码白度| 国产精品久久99日日| 久久久久9久久久久| 亚洲精品蜜桃久久久一区二区三区| 加勒比色99999| 青青草吊丝| 日本午夜操逼| 先锋影音av先锋一区| 91操熟妇| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 老熟女乱伦片| 亚洲熟女av中文字幕| 中出789在线视频| 狠狠干妹子| 色哟哟的毛片| 日本久久天堂| 日本一级二级三级网站| 久久91| 中文字幕精品亚洲熟女| 伊人久久亚洲色欲综合网站 | 天天综合91在线| 国产精品久久久久久照片| 色约约一区=区三区| 欧美三级免费伊人| 一道本久久棕合爱| 91超级碰碰| 日本视频一区二区三区| 欧美精品23| 免费网色网站| 青草一区二区| 国产大学生口爆吞精合集| 免费强奸av| 天天日天天色| 久久久久久九九九九九九| 欧美性色欧美| 国产AV超爽| 亚洲国产精品久久久久婷婷青年| 欧洲精品一区二区三区| 欧美美女视频| 最近的最新的中文字幕视频| 欧美亚洲20p| 91操熟妇| 超碰在线成人| 色综合天天爱去电影网| 无遮挡又黄又刺激的视频| 国内毛片婷婷六月色| 在线人妻熟女一区二区三区四区五区| 热久久无毒不卡| 亚洲精美粉嫩嫩泬在线观看| 伊人青青一区成人视频在线观看区| 久久久999日本大片| 婷婷五月花| 操逼大黄片| 91网亚洲| 成人性爱免费播放| 中文字幕一区二区三区视频播放| 今日头条成人一区二区三区四虎精品| 欧美美女视频| 欧美日韩99精品麻豆传媒| 欧美综合自拍亚洲综合图| 亚洲一区日韩精品中文字幕| 亚洲天天艹| 中文字幕后石码三区四区| 亚洲欧洲av影音| 人干人人人操人人摸| 91无码人妻| 蜜臀av一区二区三区免费观看| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 老司机深夜18禁污污网站| 无码外流操逼视频| 国产成人www免费人成看片| 日本大片日本一区二区免费高清| 激情综合五月婷婷| 曰本91情色| 九九热AV| 1024香蕉视频| 日韩有码专区| 亚洲九月丁香| 爱丝福利| 2024人人操人人摸| 99后入| 3PAV乱伦视频| 国产偷人伦激情在线观看| 操操操日本的逼| 亚洲在高跟鞋自慰久久在色线| #NAME?| 中文字幕av久久爽Av| 欧美高清色| 亚洲天天艹| 91av熟女人妻| 天操天操夜操夜月操月年年操操| 综合久久99| 97久久超碰日韩精品| 影音先锋乱| 风间由美日韩欧美久久| 欧美精品偷拍| 日本欧美国内在线| 肉动漫无遮挡h在线观看| 中国小夫妻勾搭露脸淫荡对白 | 婷婷探花久久精品一区| 日本99热| 亚洲精品国产熟女| 2019亚洲男人天堂| 男人的天堂亚洲| 美女被啪到深处抽搐视频| 97自拍一区| 9999免费精彩视频| 日韩精品中文字幕人妻| 玖色av| 骚货人妻偷情自拍在线视频| 中国国国产一级特黄毛片| 97超碰站| 91老妇女| 久久99精品九九久久久婷婷| 淫妻综合网| 看全色黄大色大片免费视频| 国产精品粉嫩福利在线| 亚洲综合影视| 红杏大香蕉| 一线黄色免费性爱片| 91性片| 亚洲国产中文字幕| 屌妞视频久久久久久久久久久久 | 人妻酒店出差被中出免费在线播放| 手机在线看片免费人成视频| 香蕉国产精品麻豆亚洲欧美日韩| 九九九国产| 亚洲日韩久久精品一区| 中文一区二区婷婷视频| 婷婷五月天补不补| 中文字幕在线24| 日人妻视频91| 欧美日产国产在线成人第一区| 亚欧美色图| 亚洲免费97免费| 天美传媒国产原创中文字幕亚洲欧美另类| 国产精品香蕉热久久新品| 免费岛国一级片| 9精品久久久久| 九九人妻| 九九九九免费视频| 天天操天天日青青草超碰av| 97露脸精品丝袜| 亚洲日韩AV视色| av资源在线播放天堂| 人人看人人爰人人操 | 国产av高清版| 亚洲成人av色网| 婷婷导航| 99色视频| 97久久超碰国产精品| 熟女精品一区二区在线观看| 97超碰人操| 少妇色综合| 国产午夜视频| 中文字幕超碰CAO| 精品十三区| 日韩人妻精品中文字幕| 欧美aⅴ99久久黑人专区| 97自拍一区| 伊人国产视频| 青青草中日韩在线| 九九热精品视频六| 人妻铁牛TV| 我要去看2个日本美女.com曹逼| 一本久道久久综合狠狠爱一密臀精| 97资源站国产精品| 91少妇人妻| 丁香七月婷婷| 欧美αv.com| 精品一区二区综合熟妇| 久久久久9| 色婷婷99| 性色国产东北露脸精品视频| 91国产在线精品| 蜜桃臀一区二区aV| 美女网站91| 久久9久| 日日夜夜精品| 久久草大香蕉| 日本天堂网| 亚洲不卡不卡中文字幕不卡 | 性交一区二区在线播放| 风间由美日韩欧美久久| 波多野结衣AV无码一区| 综合一区中亚洲国产成人综合精品 | 搡老熟女免费视频| 偷拍自拍在线视频观看| 思思热在线| 少妇同性| 草草草视频| 国产 日韩 欧美一区| 丁香六月激情| 激情五月天婷婷| 精品乱子一区二区三区99| 天天澡天天爽日日av| 中文字幕熟女人妻丝袜丝| 欧美综合天天| 日韩视频啪啪| 樱花草社区www中国| 久久激情视频| 亚欧性爱无码| 丰满欧美少妇| 国产91专区| 日韩欧美亚洲自拍偷拍| 国产亚洲日本精品在线| 亚洲色资源| 久湿久久| 国产啊v在线免费播放| 色婷网| 亚洲 欧美 小说| 欧美激情精品| 欧美自拍偷拍免费观看| 欧美日韩理论一区| 亚欧美综合网| 中文字幕性感少妇av| 色九月综合| 校园春色亚洲色图| 人人色人人操在线| 91超碰碰在线| www.久久制服糖| 92福利社视频| 久久在肏| 欧美成人一区二区三区在线播放| 久久久久久九九九九-美女久久久久久久-成人AV| 亚欧美综合| 欧洲精品一级二级精品综合视频综合| 亚洲1区2区三区高清中文字幕| 99青草| 狠狠入| 操比国产| 69丨亚洲丨精品丨入口免费播放| 日韩精品黄片免费观看| 大香蕉欧美国产日韩高潮| A级片一区| 男人的天堂在线有码| 亚洲综合色图欧美| 久久综合激情| 九九九国产精品| 韩国一级做a久久久久| www.丁香五月| 中文字幕视频二区| 高清无码网址| 蜜桃狠狠色伊人亚洲综合网站| 高清在线偷拍自拍视频| 91 亚欧| 自拍偷拍2025在线观看| 天干天干天干天天做| 国产成人手机视频激情| 国产AV线| 91操碰| 日本精品五区| 成 人 影视 一区 二区 三区 四区 | 香伊人在线| 国产精品小视频一区二区三区| 亚州男人天堂| 国产专区路线| 国产久久av| 久久精品男人的天堂| 国产18精品亚洲精品| 天天综合站| 欧美黄色片AAAAA| 清纯唯美综合亚洲| AV天天在线观看| 84YTCOM性无码| 9长久久精品| 图片区小说区| 中文字幕第23区| 亚洲一区二区精品福利| 欧美天天综合在线| 久久夜嗨| 国产精品岛国片在线观看| 青青草依人大香蕉| 男人的天堂2018.| 黄色人人| 俞拍久久国应视频| 做爱福利视频一区二区| 国产尹人在线视频免费| 国产狂喷潮在线精品| 天天操天天日天天干| 色情综合网| AV麻豆免费一区| 欧美综合网1| 99色在线| 国产探花精品在线| 久久加勒比| 国产日韩人人| 丁香激情网| 精品少妇人妻av久久免费| 夜夜久久久| 禁十八久久| 婷婷丁香五月激情啪啪| 久久受www免费人成| 天堂av最新电影网| 天天日天天射天天干| 看一级黄色视频| 国产午夜福利电影免费在线观看 | 狠狠爱大香蕉| 97热视频在线观看| 激情图片亚洲色图| 激情开心五月天| 欧美综合娱乐久久| 精品99999| 精品人妻高清麻豆av| 又黄又粗又硬又长又大| 97天天爽| 91日本在线观看| 久久精品国产精品一区 | 99热8| 国产乱弄免费在线视频。 | 日韩久久三区| 强奸乱伦资源| 日本熟女免费視颖| 国产一国产一级毛片古装| 极品一区二区三区免费| 大乔未久88一区| 高凊专区人人操| 开心五月天激情网| 亚洲最大的综合性av| 嫩呦国产一区二区三区AV| 国产精品操| 综合亚洲网| 日本 情色 1区2区3区| 伊人伊人LD| 91天射| 日本999精品视频| 一区二区三区日韩欧美 | 色男人色天堂东京热| 狠狠干狠狠色| 五月婷婷综合网| 天天干人妇| 日韩久久.一级黄色片| 99999国产精品| 综合亚洲网| 亚洲综合色图欧美| 国产美女91| 成人小电影网站tex| 肥佬影院91| 天天天干977| 超碰97国产欧美| 97资源站日韩| 美女久久久久久久久久久| 中文字幕一二三av| 深夜视频| 亚洲一区二区三区春色| 91伊人久| 操逼1区| 日本一级性爱| julia高潮后不停追击中出| 农村妇女一级二级三级视频| 人妻少妇精品一区二区三区| 久久综合18p| 九九九影院| 亚洲麻豆18发?| 91老妇女| 激情熟女12P| 国产专区第一页| 黄色高清无码无码破解免费暗网 | 国产伊人精品在线| 东京热一区二区中文字幕| a片 xxxx受爽视频| 亚洲,日韩,欧美,成人播放| 国产欧美岛国精品一区| 大香网伊人久久综合| 色老汉玖玖爱| 青青草日逼视频| 日韩精品人妻中文字有码在线| 久久天堂网| 天美91| 精品78| 淫荡熟女乱伦网| 色播五月婷婷| 午夜精品久久久久久久99热影院| 干美女人妻| 欧美人体性爱互联网第一页婷婷日本| 国产精品无码久久久久2028| 色婷婷影视| 麻豆AV短剧| 欧美高清16| 九九精品99| 密桃99999| 91影视亚洲| 天天干人人看综合| 欧美一级色| 男人的天堂在线| 欧美色图综合网| 自拍大香蕉乱插| 麻豆久久久久久久久丝袜| 国产精品对白自产拍| 精品人妻中文字幕高清| 日本在线视频导航| 亚洲欧美日产国产91毛片| 日韩猛交| 思思99热| 亚洲做性| 亚洲AV操| 精品国产乱码久久久兰草影视| 亚洲三级。日韩三级| www黄片免费看com| av亚洲天堂资源网站| 啊啊嗯嗯好爽| 亚洲精品色| 国产美女91| 熟女字幕| 色777999综合| AV不卡在线| 欧美暴力猛交| 日本色色视频网站| 成人熟女视频一区二区三区| 97久久超碰| 95人妻爽爽人人做人人澡| 熟妇无码视频三区| 日本一级性爱| 亚洲综合草草| 国产精品无码AV网站| 日本中文字幕一区| 无码最新| 国产欧洲精品亚洲午夜拍精品| 日韩有码 一区二区三区| av在线人气| 人妻一区二区三区四区视频| 男人的天堂在线有码| 欧美亚洲首页| 又黑又大又粗| 老司机福利青青草| 欧美18禁91| 五月婷婷丁香六月丁香| 日韩精品9999| 日韩丰满熟妇| 福利天天都操| 思思99热| 中文乱码字字幕在线第5页| xxx亚洲午夜天堂| 亚洲人妻中文在线视频| www.99热在线只有精品| 国产一在线观看| 超碰97久久国| 人人考人人摸人人干| 97超级久久| 亚洲图片欧美日韩| 一个人免费视频观看在线WWW| 精彩国产视频播放1区2区| 级做a爱无码性色永久免费| 东北女人的毛片| 亚洲第2页| 九久久九九久视频| 97网址www| 国产高清免费不卡av| 超碰欧美97资源| 激情综合五月| 国产精品白丝在线播放| 欧美色自拍| 婷婷色综合| 26UUU欧美日本| 欧美日动态视频| av资源在线播放天堂| 亚洲欧美人妻| 青草视频人妻在线观看| 9久热| 亚洲精品国产无码高清| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 大香蕉在线视频重口味毛片在线| 色婷婷视频| 欧美性性性| 久久久∴| 久久黄黄| 久久毛卡| 黄片免费日韩| 91亚洲黄色网| 色 亚洲 91| 午夜精品久久久久久久男人的天堂| 久久免费99精品久久久久久| 99热欧美| 精品国产久久乱码| 久久久久久久久久久97| 国内毛片无遮挡国产| 97国产|免费| 男人的天堂在线| 精精夜夜| 丁香五月婷婷色| 成 人片 黄色大片| 亚州欧美色图| 91色欧美| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 999综合网| 青青草精品| 在线强奷到舒服的无码视频| 日韩精品中文字幕人妻| 骚女天天综合网| 日本97久久| 国产一区二区久久| 精品国产99| 爱射综合| 欧美成人9797| 午夜欧美女人操逼| 免费看国产曰批40分钟怎么下载| 久久产精品一区二区三区电影| 撸无码不卡免费视频| 久久婷婷欧美| 99xav| 91九九九馒头| 成人精品电影| 国产超碰国产97| 中文字幕黑人大片| 色五月综合网| 人妻AV在线| 色婷婷网| 免费观看啪视频| 午夜男女爽爽爽在线视频| 国产精品呦一区二区三区| 亚洲欧洲日韩天堂av| 国产精品一二三区18| 国产一区二区二区按摩精品啪视频| 国产日本顶级一区二区三区| 这里只有97精品| 啊啊啊水好多| 欧美成人精品一区| 伊人九九九| 91模特在线观看| 日韩成人小视频| 久久精品国产亚洲粉嫩| 91强在线播放| 国产蜜臀在线| 精品女同一区二区三区| 600国产精品视频| 91人妻人人澡人人爽人人精品| 久久久久成人网| 中出欧美| 蜜乳视频网站| japan日本高清乱xxxx| 亚洲一区二区性爱电影| 色婷视频| 殴美,日韩国产伦精品| 99re3这里只有精品| 麻豆AV一区二区| 日逼五月天| 东京热大香焦| 中文字幕99999| a男人的天堂久久一级A毛片| 深夜福利黄片| 国产精品免费日韩| 超碰在线人妻| 久久久久久久久久久久久久9999| 综合天天网| 色一区二区三区综合| 综合第一页| 草莓精品视频在线免费观看| 亚洲精品a人片在线观看视| 欧美99热| 91色图片| 91天美免费| 自拍内地三级在线观看| www.91理论| 日韩啪啪啪啪啪| 亚洲精品国产精品乱码不卡| 精品人妻视频一区二区在线播放| 九七色图| 亚洲麻豆av一区二区| 金莲网址| 射 色综合| 亚洲国产亚洲天堂| 家庭乱伦麻豆| 人人考人人摸人人干| 九九九综合精品| 亚洲天堂一区二区| 欧美区亚洲区偷拍区| 激情色播| 欧美97视频| 久久97超碰| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 一区二区三区亚洲| 九九在线精品| 色眯眯av| 欧美真人抽搐一进一出gif| 国产一区二区视频在线播放| 久久成年精品| 欧美色院| 婷婷丁香五月综合| B049AV在线播放| 欧美图片校园春色| 性性欧美| 亚洲97成人在线观看| 欧美黑人精品一区二区| 九九九久千久久激情蜜桃在线看| 日韩中文字幕av在线播放| 国产精品农村妇女精品| 凹凸久久人人| 91嫩草欧美| 国产精品扒开腿做爽爽爽视频| 日韩欧美大片免费高清啪啪| 五月丁香啪啪啪| 精品一区二区2| 在线国产福利网址导航| 亚91亚洲网| 日韩无码一区二区三区| 99热国产| 久久精品操| 操逼逼无码| 91精产一区二区三区| 国产精品分类在线观看| 麻豆 欧美 日韩| 91天堂网| 天天爽天天操| 深夜视频| 日本欧美成人片AAAA| www欧美91| 婷婷五月天丁香| 熟妇人妻一二三区免费| 97任你吞精| 日本一级不卡一二区| gogogo免费高清看中国国语| 欧美久久草熟女| 国产精品人妻无码久久久互動交流| 丁香五月天激情| 97伊人| 色色99| 亚洲资源站| 欧美专区第一页| 97超碰色| 麻豆影音天美视频| 中文日本免费高清| 最新欧美色网| 日韩精品在线视频,日韩精品……| 久久99热这里只频精品6学生| 天天综合官网| 欧美 中文字幕 一区| 久久91| 国模不卡一本二本三电影| dy888午夜老子影视达达兔| 天堂蜜桃无码视频一区二区| 精品一级毛片在线观看| 国产超碰在线一区| 国产日韩精品无码去免费专区国产| 中文字幕版| 中国一级操逼视频| 综合久欧洲| 国产欧美日韩一区二区三区| 97在线观看免费| 女优免费一区二区永久| 超碰天天去日穴| 猛交交| 免费αV在线视频| 亚洲视频二区| 久久人人舔人人爽舔人人av片| 大干人妻| 人妻啊啊人妻啊啊| 中日韓欧美高清| 毛片中心9视频99| 精品国产乱码久久| 亚洲色图加勒比| 欧美性爱精品七区| 欧美 亚洲 91| 亚洲精品中文字幕一区在线视频 | 97在线欧洲| 无码高清专| 夜夜欢天天干| 高清肉丝中文无码| 国产少妇肉丝在线观看| 啪啪视频亚洲第一| 亚洲欧美97√| 99国产精品久久久在线播放| 国产树林里野战在线看| 亚洲成人贴图| 又黄又粗又硬又长又大| 日本三级一区二区 在线| 密臀在线视频| 综合97亚洲| 很很干很很操| 国产亚洲精品农村妇女 | 性色生活片久久毛片婬片免费放女人一级毛片| 人人妻人人色一区二区三区| 伊人97色天使| 5月婷婷6月六月丁香| 天天看天天日天天操| 国产女主播视频在线观看| 天天干天天日天天射黄色| 精品亚洲黄色片 国产精品导航一区二区| 97久久超碰日韩精品| 后入内射蜜桃臀| 成人av动漫在线观看| 激情小说日韩无码| 上床啊啊啊| 女上位精品在线| www.高清无码诱惑一区.com| 久久久草成人网站久久久草成人久久久草久久久 | 欧美色图片| 欧洲精品网| 人妻天天爽夜夜爽爽| 91精品黄在线观看| 免费av在线播放二区| 舔人妻中文免费视频| 亚洲免费97免费| 美女啊啊啊啊啊啊啊| 爱我干综合| 玖玖爱免费观看视频| 97在线免费观看视频| 久久精品国产亚洲粉嫩| 成人精品一区二区三区| 91色噜噜狠狠| 偷窥自拍亚洲色图| 久久人妻视频| 97福利视频| 久操精品网| 免費黃色視頻觀看一| 美國A片| 亚洲国产精品无码AV在线| 老外又粗又长一晚做五次| 人妻一区二区三区四区视频| 男人的天堂免费| 欧美成人精品欧美一级乱黄一区二… | 久久天堂网| 少妇色综合| 国产一区二区久久| 精品国产99| 久久亚洲骚逼综合| 免费观看有码高清视频| 丁香六月综合激情| 韩国三级理论在线| 九月激情婷婷| 亚洲婷婷综合网| 秋霞怕怕片| 色屁屁影院www国产| 中文字幕三四五区| 欧在线一二区| 超碰97亚洲区| 97天天插| 日韩国产十八禁| 欧美变态激情网| 91 在线亚洲| 日韩伦理视频| 成人A片男人的天堂| 欧美少妇高潮久久91| 欧美性区| 欧美亚洲激情一二三| 搡老女人老91妇女熟女| 日本新免费二区三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 男女激烈网站最新| 一,爱啪啪,在线免费视频| 乱伦av麻豆| 久久xx| 天天干2019| 欧美日韩婷婷中文| 国产精品网站www| 中文字幕欧美日本乱码一线二线| 无码精品啪啪啪一区二区三区三州| 97操97干| 国产精品农村妇女| 蜜乳AV免费观看| 午夜乱轮操逼视频免费看| 午夜寂寞欧美| 在线人人人人人人精品超| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 丰满人妻区一区二区三| 天天操人人操狠狠插| se01国产在线视频| 日本一级黄色电影| www.婷婷六月天| 97国产天堂岛| 久久线上视频免费看| 精品无码一区二区三区| 综合自拍| 内射黑人| 78精品| 超碰在线观看av不卡| 欧美视频一区二区在线| 亚州国产精品乱| 国产人妻一区二区三区欧美毛片| 欧美 牲| 97干在线视频| 黄片aaaaa一区| 久久9亚洲| 青青草导航在线视频| 日本黄色精品专区网站| a在线观看| 亚洲一本色码中文字幕| 69精品| 人成午夜免费大片| 在线97在线| 国产精品夜夜| 黑人嘿嘿嘿超爽免费视频| 成人AV素股で擦久久| 国产美女91| 在线观看无码三级少妇| 久操综合在线| 人人澡人人澡人人| 操逼免费视频无码国产| 国产福利第一视频| 国产av青草| 麻豆 亚洲 97| 91国产丝袜白虎| 91狠狠综合久久| h无码动漫在线观看| 黄色成年| 奇米狠999| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 亚洲乱色视频一区、二区在线| 99日免费视频中文字幕| 亚洲AV成人精品网站在AV| 视频二区美腿丝袜制服人妻欧美| 国产91专区| 欧美激情性爱视频网站| 欧美99热| 人妻色情天天操| 黄色av片三级三级三级免费看| 怡春苑东京热| 成人五级久久| 91伊人影视综合| 欧美日韩国产成人高清| 久久国产精品一级二级三级| 男人综合网| 丁香五月婷婷基地| 超碰97国产欧美| 丁香五月天激情| 91劲爆| 欧美高清无码免费视频高清版| 色婷婷五月综合激情中文字幕| 青青草无码视频| 黄片免费久久久久久久| 亚洲日韩XXX| 国精精品无码一二三区水多多| a人片中文字幕一区二区| 福利操逼| av东京热男人的天堂| 性色av蜜臀av色欲aV| 中亚黄色三级大片| 日韩免费三级黄片电影| 天堂精品小草| 综合 亚洲 欧美| 欧亚综合一卡二卡中文字幕| 99无码| 啊啊啊啊二区好大| 国产精品网址| 天欧美在线| 婷婷香蕉| 无码人妻精品酒店| 操逼内射干逼白丝91| 日产操逼| 素人无码中文字幕| 美国一区二区免费视频| 欧美色图片色哟哟| 色优久久| 欧美成人精品欧美一级乱黄一区二…| 婷婷五月天av| 桃花色综合影院| 蜜臀亚洲综合一二三四区| 中国女人内射6XXXXX| 老熟女综合网| 久热久一区二区三区| 91无码西班牙视频在线| 久久伊人青青草| 久操凹凸视频| 情色大香蕉| 久久蜜桃综合网| 婷婷中文网| 天天澡天天爽日日AV| 素颜老阿姨乱情色| 美女尤物福利视频| 手机在线中文字幕国产| 欧美人妻少妇| 亚洲一区制服诱惑| 夜夜嗨AV一区天天| 亚洲乱码国产乱码精网站| 91久久久久久久久18| 老司机午夜精品福利视频一区二区| 日韩欧美成人午夜福利| 亚洲小说视频| 大香蕉欧美国产日韩高潮| 无码视频黄色网战| 欧美人与动性人交a| 亚洲怡春院| 91美女视屏| 97人人超| 国产91乱伦| 国产久久久久久| 情色五月天网| 六月婷激情福利天堂69| 岛国片国产成人亚洲播放| 亚洲熟妇AV日韩熟妇在线| 亚洲 欧美 另类 综合 偷拍| 99久久婷婷国产综合| 精品久久久久久AV无码| 久午视频| 九九热超碰97亚洲最新香蕉| 精品超碰国产| 国产精品一区午夜福利| 免费观看日本操逼视频| 亚洲欧美内射| 91精品电影18| 奇米四色影视777久久久| 精品人妻一区二区三区鲁大师| 美女高潮视频91| www黄片免费看com| 日韩操啪| 亚洲激情视频| 欧美爱国产综合、| 欲香欲色天天天综合和网| 在现视频女上位好爽| 成人小电影网站tex| 日韩黄片影院| 欧美 亚洲精品首页| 欧美视频一区二区三区| 久久华人网| 久久成人午夜狠狠| 亚洲图片在线| 久久精品视频久久久| 91n美女视频| 美女在线H91| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 日韩钢筋无码高清啾啾啾| 欧美人妻精品| 91在线视频免费中出| 91色爽欧美| 天天香香欲综合| a人欧美综合天堂麻豆| 一区二区 韩日AV| ′ !γ}丶。。久久精品欧美一区二区三区|