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

ARTICLE DETAIL

資訊詳情

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

CKEditor跨瀏覽器粘貼圖片上傳PHP統(tǒng)一格式方案

CKEditor跨瀏覽器粘貼圖片上傳PHP統(tǒng)一格式方案 寫這篇東西的起因是前陣子有個(gè)朋友在群里吐槽項(xiàng)目用的CKEditor用戶從截圖軟件、微信、word里復(fù)制圖片往編輯器里一貼結(jié)果瀏覽器之間表現(xiàn)完全不一樣。Chrome里粘貼變成base64大長串Firefox里有些圖片能傳有些傳不上去Safari干脆沒反應(yīng)。而且圖片格式五花八門有png有jpg有webp上傳到PHP服務(wù)器后要么擴(kuò)展名和實(shí)際格式對不上要么透明背景變成黑塊。他問我跨瀏覽器用CKEditor粘貼圖片到PHP服務(wù)器到底怎么統(tǒng)一格式這個(gè)問題其實(shí)很多做后臺管理系統(tǒng)、富文本編輯器、CMS、甚至B端工作臺的人都遇到過。編輯器的粘貼圖片上傳本質(zhì)上是三條線的交匯瀏覽器剪貼板API的兼容性處理、CKEditor事件機(jī)制的攔截、PHP服務(wù)端的文件接收與格式重編碼。任何一條線沒處理好就會出各種怪問題。這篇文章把我自己項(xiàng)目里沉淀下來的完整方案拆開講清楚包括前端怎么攔截粘貼事件、怎么跨瀏覽器拿到圖片文件、怎么在前端把格式統(tǒng)一以及服務(wù)端PHP怎么用GD庫做二次兜底轉(zhuǎn)換和安全校驗(yàn)。如果你正在做或者準(zhǔn)備做類似的編輯器和上傳功能這篇文章可以直接當(dāng)作參考方案來用。1. 整體方案設(shè)計(jì)與思路拆解1.1 核心痛點(diǎn)粘貼圖片對編輯器來說究竟意味著什么用戶從外部復(fù)制一張圖片然后粘貼到編輯框里這對CKEditor來說本質(zhì)上是一個(gè)內(nèi)容插入事件。它不像input typefile那樣直接把圖片文件丟給你而是把剪貼板里的數(shù)據(jù)當(dāng)作一段HTML或者文本內(nèi)容塞進(jìn)編輯器。問題就出在這里剪貼板里的圖片在不同瀏覽器里呈現(xiàn)的形式完全不同。Chrome和Edge在粘貼圖片時(shí)默認(rèn)會把圖片轉(zhuǎn)成base64編碼的data URL然后以img srcdata:image/png;base64,...的形式插入編輯器。這種做法的后果是編輯器的內(nèi)容區(qū)會塞進(jìn)一大段幾十KB甚至幾MB的字符串保存到數(shù)據(jù)庫時(shí)會直接把列表頁拖垮。Firefox在這方面相對老實(shí)一點(diǎn)它更多時(shí)候會提供文件對象但不同版本之間表現(xiàn)也不穩(wěn)定。Safari在macOS上從訪達(dá)復(fù)制圖片文件時(shí)可以拿到文件但從網(wǎng)頁內(nèi)復(fù)制圖片時(shí)卻經(jīng)常只有HTML沒有文件對象。早期版本的IE更不用提根本不支持DataTransfer相關(guān)API。除此之外還有一個(gè)隱含的痛點(diǎn)圖片格式五花八門。用戶粘貼的可能是PNG截圖、JPEG照片、webp網(wǎng)頁圖片、甚至從微信復(fù)制過來的不明格式。如果不加干預(yù)保存到服務(wù)器上的就是一堆擴(kuò)展名和實(shí)際格式混亂的文件后續(xù)做圖片處理、兼容性展示、二次壓縮都很麻煩。所以統(tǒng)一格式并不是一個(gè)單純的技術(shù)潔癖問題而是直接關(guān)系到后臺圖片存儲規(guī)范和頁面穩(wěn)定性的實(shí)際需求。1.2 方案選型為什么不讓編輯器自動(dòng)處理而是自己攔截CKEditor 4本身是支持配置圖片上傳的官方文檔里有filebrowserImageUploadUrl這類的配置項(xiàng)配合文件管理器或者自研上傳接口來做圖片上傳。但如果你實(shí)際試過就會知道這個(gè)內(nèi)置流程對粘貼上傳的支持并不理想尤其是跨瀏覽器場景。它更多是為點(diǎn)擊按鈕選擇文件上傳設(shè)計(jì)的粘貼時(shí)它傾向于直接插入base64而不是把圖片當(dāng)作上傳任務(wù)處理。所以更穩(wěn)妥的做法是自己監(jiān)聽編輯器的paste事件在編輯器默認(rèn)邏輯執(zhí)行之前把圖片攔截下來提取成文件對象走自己的上傳接口。這樣有幾個(gè)好處一是可以針對不同瀏覽器分別處理兼容性可控二是可以決定哪些圖片粘貼后上傳、哪些不做處理三是可以在上傳前做格式統(tǒng)一和壓縮而不是把圖片原封不動(dòng)地塞進(jìn)編輯器。從后端視角看服務(wù)端也必須做二次兜底。前端統(tǒng)一格式雖然在大多數(shù)場景下可靠但你不能依賴前端傳過來的文件和參數(shù)完全可信任。而且從Word等富文本工具里粘貼過來的圖片經(jīng)常是嵌入在HTML里的base64或者特殊格式的二進(jìn)制流這些路徑下前端不一定來得及攔截服務(wù)端必須能夠在接收后判斷真實(shí)格式并做轉(zhuǎn)換。前端統(tǒng)一格式解決體驗(yàn)問題后端統(tǒng)一格式解決可靠性和安全問題兩條路同時(shí)走才能保證最終落到服務(wù)器上的文件一定是統(tǒng)一的、規(guī)范的。1.3 整體數(shù)據(jù)流設(shè)計(jì)整套流程走下來可以把數(shù)據(jù)流拆成四個(gè)關(guān)鍵節(jié)點(diǎn)粘貼事件觸發(fā)、前端提取與轉(zhuǎn)換、異步上傳、服務(wù)端接收與再加工。每一步都有它的職責(zé)和容易踩坑的地方我列個(gè)簡表說明節(jié)點(diǎn)關(guān)鍵職責(zé)主要風(fēng)險(xiǎn)點(diǎn)粘貼事件觸發(fā)捕獲剪貼板中的圖片數(shù)據(jù)部分瀏覽器事件獲取時(shí)機(jī)不同前端提取與轉(zhuǎn)換獲取File對象Canvas重編碼為統(tǒng)一格式跨域圖片污染Canvas異步上傳FormData提交到PHP接口跨域CORS配置、超時(shí)服務(wù)端接收與再加工校驗(yàn)真實(shí)格式GD庫重編碼保存擴(kuò)展名偽造、透明通道黑色塊這個(gè)流程里最核心的設(shè)計(jì)原則是前端做體驗(yàn)層優(yōu)化服務(wù)端做兜底和規(guī)范。前端優(yōu)先把圖片轉(zhuǎn)成統(tǒng)一的格式和合理的尺寸減輕服務(wù)端壓力服務(wù)端則無論如何都按真實(shí)內(nèi)容來保存而不是按聲稱的格式來保存。兩層各自獨(dú)立又互相配合。2. 前端攔截粘貼圖片的完整實(shí)現(xiàn)2.1 監(jiān)聽paste事件并讀取剪貼板數(shù)據(jù)CKEditor 4的實(shí)例在instanceReady事件觸發(fā)后我們就可以通過editor.on(paste, handler)來監(jiān)聽粘貼事件。請注意這里的paste事件是CKEditor封裝過的事件對象內(nèi)部會提供evt.data.dataTransfer這個(gè)對象和瀏覽器原生clipboardData基本等價(jià)但在不同瀏覽器里字段的表現(xiàn)形式有細(xì)微差異所以不能只寫一種寫法就指望所有瀏覽器通用。CKEDITOR.on(instanceReady, function(e) { var editor e.editor; editor.on(paste, function(evt) { var dataTransfer evt.data.dataTransfer; if (!dataTransfer) { return; } console.log(剪貼板類型, dataTransfer.types); }); });很多人在這一步就會遇到第一個(gè)坑綁定的時(shí)間不對。如果你在instanceReady之前就去editor.on(paste)那么大部分事件根本不會觸發(fā)因?yàn)榫庉嬈鲀?nèi)部的實(shí)例還沒初始化完成事件機(jī)制還沒掛載。還有一個(gè)非常隱蔽的問題有些瀏覽器在paste事件里dataTransfer雖然有值但items是空的反而files里有數(shù)據(jù)。這個(gè)在下面的跨瀏覽器處理里具體展開。2.2 從不同瀏覽器中可靠地拿到圖片文件拿到dataTransfer之后任務(wù)就從事件監(jiān)聽階段切換到找圖片階段。標(biāo)準(zhǔn)做法是先遍歷dataTransfer.items找type以image/開頭的項(xiàng)然后調(diào)用getAsFile()獲取文件對象。但真實(shí)世界沒有這么理想我整理了三種常見來源對應(yīng)不同的處理方式。第一種也是最常見的dataTransfer.items里存在圖片項(xiàng)getAsFile()能正常返回File對象。這種情況出現(xiàn)在Chrome、Edge、Firefox的新版本里用戶從本地復(fù)制圖片文件或者從截圖工具粘貼時(shí)基本都是這個(gè)路徑。第二種items里沒有圖片項(xiàng)但dataTransfer.files里有文件。這種情況在Safari和部分Firefox版本中經(jīng)常出現(xiàn)。所以判斷順序不能只盯著items看files也要檢查。第三種剪貼板里沒有文件對象但text/html數(shù)據(jù)里嵌著一串base64圖片通常是從網(wǎng)頁上直接復(fù)制圖片時(shí)出現(xiàn)這種情況。這時(shí)候需要從text/html中提取img srcdata:image/...里的data URL再把它轉(zhuǎn)成Blob對象。function extractImageFile(dataTransfer) { // 方式一從 items 中取 var items dataTransfer.items || []; for (var i 0; i items.length; i) { if (items[i].type items[i].type.indexOf(image) ! -1) { var file items[i].getAsFile items[i].getAsFile(); if (file) { return file; } } } // 方式二從 files 中取 if (dataTransfer.files dataTransfer.files.length 0) { return dataTransfer.files[0]; } // 方式三從 text/html 中解析 data URL var html dataTransfer.getData(text/html); if (html html.indexOf(data:image) ! -1) { var match html.match(/src(data:image\/[^])/); if (match) { return dataURLToBlob(match[1]); } } return null; } function dataURLToBlob(dataURL) { var arr dataURL.split(,); var mime arr[0].match(/:(.*?);/)[1]; var bstr atob(arr[1]); var n bstr.length; var u8arr new Uint8Array(n); while (n--) { u8arr[n] bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); }這段代碼我建議直接作為工具函數(shù)常駐前端公共庫里不只編輯器用其他地方需要讀取剪貼板圖片也可以用。走通這段邏輯Chrome、Firefox、Edge、Safari這四個(gè)主流瀏覽器基本都能拿到圖片文件了。2.3 攔截默認(rèn)的base64插入行為這是整個(gè)流程里最容易被忽略、但影響最大的一步。如果我們只提取圖片文件而不做攔截那么CKEditor默認(rèn)的粘貼處理器會同時(shí)把base64圖片插入編輯器導(dǎo)致上傳之后編輯器里出現(xiàn)兩個(gè)圖片一個(gè)是你上傳后插入的URL版本一個(gè)是默認(rèn)處理的base64版本。所以拿到圖片文件之后第一時(shí)間要調(diào)用evt.data.preventDefault()阻止默認(rèn)行為。editor.on(paste, function(evt) { var imageFile extractImageFile(evt.data.dataTransfer); if (!imageFile) { return; } evt.data.preventDefault(); handlePastedImage(imageFile); });這里有一個(gè)經(jīng)驗(yàn)點(diǎn)preventDefault()的位置很重要必須在判斷出確實(shí)有圖片文件之后才調(diào)用。如果判斷沒有圖片就放行讓編輯器正常處理文字粘貼或者其他內(nèi)容。一旦誤攔截用戶復(fù)制普通文本也會沒反應(yīng)體驗(yàn)非常糟糕。另外如果你的編輯器開啟了forcePasteAsPlainText這類配置要特別注意它和preventDefault的相互作用處理不好容易導(dǎo)致攔截后插入的內(nèi)容丟失。2.4 前端統(tǒng)一格式用Canvas把圖片轉(zhuǎn)換成目標(biāo)格式拿到File對象之后就要面對統(tǒng)一的第一個(gè)層面格式統(tǒng)一。這個(gè)步驟可以在前端做也可以用服務(wù)端做我的建議是兩層都做。前端做的好處是圖片在上傳前就變成了統(tǒng)一的格式、合理的尺寸和合適的體積上傳壓力小后端拿到直接存就是規(guī)范文件。前端轉(zhuǎn)換圖片格式的核心工具是Canvas。思路很簡單讀取圖片-繪制到Canvas-用canvas.toBlob()輸出指定格式的Blob對象。關(guān)鍵點(diǎn)在兩個(gè)地方要填白底以及要控制質(zhì)量參數(shù)。填白底的目的是為了防止PNG格式的透明圖片在轉(zhuǎn)換成JPEG后透明區(qū)域變成黑色。Canvas在沒有背景色的情況下導(dǎo)出JPEG透明區(qū)域默認(rèn)是黑色這在視覺上非常突兀。所以在繪制之前必須先用白色填充整個(gè)畫布再畫圖片。這個(gè)坑我見過無數(shù)次前端不填白、后端也不處理最后所有帶透明通道的截圖傳上去都是黑底。function convertImageFile(file, targetType, quality) { return new Promise(function(resolve, reject) { var url URL.createObjectURL(file); var img new Image(); img.onload function() { var canvas document.createElement(canvas); canvas.width img.naturalWidth; canvas.height img.naturalHeight; var ctx canvas.getContext(2d); if (targetType image/jpeg) { ctx.fillStyle #ffffff; ctx.fillRect(0, 0, canvas.width, canvas.height); } ctx.drawImage(img, 0, 0); URL.revokeObjectURL(url); canvas.toBlob(function(blob) { if (blob) { resolve(blob); } else { reject(new Error(canvas.toBlob返回空)); } }, targetType, quality || 0.92); }; img.onerror function() { URL.revokeObjectURL(url); reject(new Error(圖片加載失敗)); }; img.src url; }); }這個(gè)函數(shù)里還隱含了一個(gè)問題如果用戶粘貼的圖片本身來源于跨域資源比如從另一個(gè)域名的網(wǎng)頁上復(fù)制那么img讀取該圖片時(shí)Canvas會被污染toBlob()會直接拋錯(cuò)。但好在我們這個(gè)場景里用戶粘貼的都是剪貼板里的文件或者data URL本質(zhì)上都在本地不涉及跨域所以這個(gè)函數(shù)是安全的。當(dāng)然如果你后續(xù)要處理編輯器里已存在的跨域圖片再壓縮那就需要額外給img加上crossOriginanonymous屬性并且服務(wù)端配合CORS。3. 上傳接口與PHP服務(wù)端處理3.1 前端用FormData異步上傳格式轉(zhuǎn)換完成后把Blob對象放進(jìn)FormData作為普通文件上傳即可。需要注意的一個(gè)細(xì)節(jié)是Blob對象的文件名。如果你不指定文件名某些瀏覽器會以blob作為文件名PHP的$_FILES[file][name]可能會變成blob這會影響后綴判斷。更好的做法是手動(dòng)指定一個(gè)統(tǒng)一后綴的文件名比如paste_1736244109.jpg。function uploadPastedImage(blob, editor) { var fd new FormData(); var filename paste_ Date.now() .jpg; fd.append(file, blob, filename); // 可以帶一個(gè)format參數(shù)告訴服務(wù)端我們希望統(tǒng)一成什么格式 fd.append(format, jpg); fetch(/api/upload.php, { method: POST, body: fd }) .then(function(res) { return res.json(); }) .then(function(json) { if (json.code 0) { editor.insertHtml(img src json.url alt粘貼圖片 /); } else { alert(json.msg || 上傳失敗); } }) .catch(function(error) { console.error(上傳異常, error); }); }我推薦使用fetch但如果你項(xiàng)目的瀏覽器兼容性要求特別老比如需要兼容IE11那就改用XMLHttpRequest邏輯完全一樣。不要用canvas.toDataURL()拿到base64再傳到服務(wù)端去處理那樣數(shù)據(jù)的體積比二進(jìn)制Blob要膨脹三分之一左右徒增傳輸壓力而且服務(wù)端還要多做一步base64解碼。3.2 PHP接收與安全校驗(yàn)PHP側(cè)的第一步工作是接收文件、檢查錯(cuò)誤、判斷大小。這里有兩件事要特別強(qiáng)調(diào)一是$_FILES[file][error]必須檢查這是判斷上傳是否成功的第一道關(guān)卡二是絕對不要信任前端傳過來的文件名和MIME類型。為什么不能信任MIME類型因?yàn)闉g覽器在構(gòu)造multipart/form-data請求時(shí)$_FILES里的type字段完全由客戶端控制偽造image/jpeg沒有任何技術(shù)門檻。如果直接用這個(gè)值決定后續(xù)處理等于把安全門敞開著。正確做法是用PHP的getimagesize()函數(shù)讀取臨時(shí)文件拿到真實(shí)的圖片寬高信息、真實(shí)MIME類型。這個(gè)函數(shù)會檢查圖片文件頭如果文件根本不是圖片它會返回false自然就把偽造攻擊擋掉了。$file $_FILES[file]; if (!$file || $file[error] ! UPLOAD_ERR_OK) { echo json_encode([code 1, msg 上傳失敗]); exit; } if ($file[size] 5 * 1024 * 1024) { echo json_encode([code 1, msg 文件大小不能超過5MB]); exit; } $info getimagesize($file[tmp_name]); if ($info false) { echo json_encode([code 1, msg 文件不是有效圖片]); exit; } $mime $info[mime]; $allowedMimes [ image/jpeg jpg, image/png png, image/gif gif, image/webp webp, image/bmp bmp, ]; if (!isset($allowedMimes[$mime])) { echo json_encode([code 1, msg 不支持的圖片格式]); exit; }這段邏輯就是按真實(shí)內(nèi)容判定格式的原則。前端說它是jpg不管PHP看文件頭判斷出它實(shí)際上是png就按png處理。這樣能保證后續(xù)的格式轉(zhuǎn)換一定成功。3.3 用GD庫統(tǒng)一圖片格式的完整代碼PHP服務(wù)端的格式統(tǒng)一使用的是PHP內(nèi)置的GD庫。相比ImageMagickGD庫的優(yōu)點(diǎn)是幾乎所有PHP環(huán)境默認(rèn)開啟不需要額外安裝擴(kuò)展操作也簡單。它的核心思路是真實(shí)MIME決定怎么解碼目標(biāo)格式?jīng)Q定怎么輸出中間用imagecopyresampled()重采樣。要注意的仍然是白色背景問題。GD庫在把帶透明通道的PNG圖片轉(zhuǎn)成JPEG時(shí)如果不先填充背景色透明區(qū)域會變成黑色。這個(gè)問題如果前端已經(jīng)處理過服務(wù)端可以少操一份心但程序不能假設(shè)前端一定做了服務(wù)端必須再做一次。代碼如下function convertToFormat($srcPath, $format, $quality 92) { $info getimagesize($srcPath); $mime $info[mime]; $width $info[0]; $height $info[1]; switch ($mime) { case image/jpeg: $src imagecreatefromjpeg($srcPath); break; case image/png: $src imagecreatefrompng($srcPath); break; case image/gif: $src imagecreatefromgif($srcPath); break; case image/webp: $src imagecreatefromwebp($srcPath); break; case image/bmp: $src imagecreatefrombmp($srcPath); break; default: return false; } if (!$src) { return false; } // 如果要輸出jpeg先鋪白底 $dst imagecreatetruecolor($width, $height); if ($format jpg) { $white imagecolorallocate($dst, 255, 255, 255); imagefill($dst, 0, 0, $white); } imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $width, $height); ob_start(); if ($format png) { imagepng($dst); } else { imagejpeg($dst, null, $quality); } $data ob_get_contents(); ob_end_clean(); imagedestroy($src); imagedestroy($dst); return $data; }這里解釋一下為什么用ob_start()配合imagejpeg($dst, null, $quality)而不是直接imagejpeg($dst, $path, $quality)。因?yàn)槿绻阋趦?nèi)存里拿到圖片的二進(jìn)制內(nèi)容最干凈的方式就是讓GD庫往輸出緩沖區(qū)里寫然后再從緩沖區(qū)讀出來。直接指定文件路徑寫入也可以但那樣你還要多一步讀文件而且在確定命名之前就落盤遠(yuǎn)不如內(nèi)存操作干凈。unlink()清理臨時(shí)文件這些細(xì)節(jié)同樣別忽略。如果你還想連尺寸也統(tǒng)一比如超過2000像素的圖片等比縮到2000像素以內(nèi)那就在創(chuàng)建$dst之前做一次目標(biāo)尺寸計(jì)算。這個(gè)擴(kuò)展非常容易但效果很好因?yàn)榫庉嬈髋鋱D一般不需要超過2000px的圖限制尺寸能夠極大降低存儲壓力。3.4 文件命名、目錄與返回URL設(shè)計(jì)格式統(tǒng)一之后就要考慮保存文件的命名規(guī)則和目錄結(jié)構(gòu)。我強(qiáng)烈不建議使用用戶上傳的原始文件名原因有兩個(gè)一是原始文件名可能是中文、特殊字符或者超長字符串直接作為文件名容易產(chǎn)生編碼問題甚至被利用路徑穿越漏洞二是不同瀏覽器粘貼圖片時(shí)的默認(rèn)命名不同達(dá)不到統(tǒng)一規(guī)范的效果。建議的命名規(guī)則按日期分目錄文件名用uniqid()加隨機(jī)字符串再加上統(tǒng)一后的擴(kuò)展名。比如uploads/2024/07/01/65c0a1b2c3d4e5f6a7b8c9d0.jpg。這樣既保證唯一性又方便按日期歸檔目錄也不會無限膨脹。$format isset($_POST[format]) $_POST[format] png ? png : jpg; $convertedData convertToFormat($file[tmp_name], $format, 92); if ($convertedData false) { echo json_encode([code 1, msg 圖片格式轉(zhuǎn)換失敗]); exit; } $dateDir date(Ymd); $filename $dateDir . / . uniqid(img_, true) . . . $format; $absolutePath $uploadDir . $filename; if (!is_dir(dirname($absolutePath))) { mkdir(dirname($absolutePath), 0755, true); } file_put_contents($absolutePath, $convertedData);最后返回的JSON里要包含圖片的完整URL這個(gè)URL是前端用來插入編輯器的。要注意的是URL不要拼PHP代碼里盡量用配置項(xiàng)維護(hù)一個(gè)baseUrl變量方便在不同環(huán)境下切換。比如本地環(huán)境是http://localhost/uploads線上是https://yourdomain.com/uploads如果不統(tǒng)一管理部署環(huán)境和線上環(huán)境很容易出現(xiàn)圖片路徑不一致的問題。$baseUrl https://yourdomain.com/uploads/; echo json_encode([ code 0, url $baseUrl . $filename, size strlen($convertedData), format $format, ]);4. 跨域、回調(diào)與CKEditor插入的銜接4.1 谷歌瀏覽器跨域問題怎么解決抓到圖片之后前端要發(fā)請求到PHP接口如果編輯器的頁面和上傳接口的域名不一致瀏覽器就會攔截跨域請求。這個(gè)在Chrome里表現(xiàn)得尤其嚴(yán)格預(yù)檢請求不通過直接給你打在console里。解決辦法是服務(wù)端設(shè)置CORS響應(yīng)頭允許你的前端域名跨域訪問。// 入口文件或上傳接口文件頭部添加 header(Access-Control-Allow-Origin: https://yourfrontenddomain.com); header(Access-Control-Allow-Methods: POST, OPTIONS); header(Access-Control-Allow-Headers: Content-Type); header(Access-Control-Max-Age: 86400); // 命中預(yù)請求直接返回204 if ($_SERVER[REQUEST_METHOD] OPTIONS) { http_response_code(204); exit; }這里特別提醒一句跨域配置的作用域很小一般只在接口文件里加就行不要全局加免得把整個(gè)站點(diǎn)的CORS都放開反而引入不必要的風(fēng)險(xiǎn)。Access-Control-Allow-Origin不要寫成*一定要寫死你前端的域名。寫*確實(shí)省事但只要你這個(gè)接口稍微有點(diǎn)內(nèi)部屬性比如將來需要帶Cookie做登錄校驗(yàn)?zāi)?就直接廢掉了還得重來。另外如果你做的是前后端分離架構(gòu)前端在localhost:8080、接口在localhost:80這也屬于跨域。本地開發(fā)和線上環(huán)境要分別維護(hù)或者統(tǒng)一走反向代理。這個(gè)小細(xì)節(jié)能省掉很多本地調(diào)試時(shí)莫名其妙的報(bào)錯(cuò)。4.2 上傳成功后把圖片插回編輯器圖片上傳成功、拿到了URL接下來要高保真地把圖片插入編輯器。CKEditor 4里最便捷的方式是editor.insertHtml()把完整的img標(biāo)簽插到光標(biāo)位置。editor.insertHtml(img src json.url alt粘貼圖片 stylemax-width:100%; /);這里插的stylemax-width:100%;建議帶上因?yàn)楹芏嗪笈_編輯器場景里用戶粘貼的圖片可能非常寬如果不設(shè)最大寬度限制大圖片會直接把編輯區(qū)撐爆導(dǎo)致排版崩壞。雖然CSS可以在外部統(tǒng)一定義但每次插入時(shí)帶上內(nèi)聯(lián)樣式是最穩(wěn)妥的它不依賴外部的樣式表是否生效。還要注意CKEditor的過濾機(jī)制。CKEditor 4配置了allowedContent或者extraAllowedContent的話某些標(biāo)簽屬性會被剝離。如果你發(fā)現(xiàn)圖片插入后被過濾掉或者style屬性消失就需要在config.extraAllowedContent里加上img[src,alt,title](*){*}之類的規(guī)則允許圖片保留這些屬性和樣式。4.3 CKEditor4和CKEditor5在API上的差異CKEditor 4的editor.on(paste)這套機(jī)制在CKEditor 5里有比較大的變化。CKEditor 5的粘貼流程走的是它的Clipboard插件體系直接在editor.on(paste)里攔截的寫法不再適用。CKEditor 5監(jiān)聽的是editor.plugins.get(Clipboard)相關(guān)的paste事件而且事件的參數(shù)結(jié)構(gòu)和CKEditor 4不一樣。如果你用的是CKEditor 5可以這樣處理editor.plugins.get(Clipboard).on(paste, function(evt, data) { var items data.dataTransfer.items; // 后續(xù)獲取文件的方式和CKEditor 4類似 });不過老實(shí)說CKEditor 5對于粘貼圖片的默認(rèn)處理更像把圖片上傳并插入圖片鏈接因?yàn)樗诟晃谋揪庉嬈骼镆肓吮容^完整的上傳處理管線。但默認(rèn)配置下它未必會統(tǒng)一格式、未必會走你自己定義的PHP接口所以真正生產(chǎn)級項(xiàng)目里還是建議按你自己的業(yè)務(wù)需求來封裝一層而不是完全依賴編輯器的默認(rèn)行為。如果你的項(xiàng)目還在用CKEditor 4那文章里前段的方案就是可以直接落地的。4.4 兼容性細(xì)節(jié)與不同瀏覽器表現(xiàn)關(guān)于跨瀏覽器兼容性再分享幾個(gè)實(shí)測下來很容易出問題的點(diǎn)。第一個(gè)是Safari的粘貼行為。在macOS上從訪達(dá)復(fù)制圖片文件Safari是可以拿到File對象的但從網(wǎng)頁里復(fù)制一張圖片Safari經(jīng)常只會給出一段包含data:image的HTML。所以前面的extractImageFile()里的第三種方式解析text/html中的data URL就是專門為這種場景兜底的。第二個(gè)是Firefox的dataTransfer.items。Firefox在某些版本里items的length是0但files里有數(shù)據(jù)。所以判斷邏輯一定不要只在一種數(shù)據(jù)源上鉆牛角尖兩種都要檢查。第三個(gè)是Chrome的clipboardData在粘貼事件里的表現(xiàn)。Chrome在粘貼圖片時(shí)dataTransfer.items里會有一個(gè)kind: file、type: image/png的項(xiàng)getAsFile()大概率可以拿到文件。但如果你在paste事件回調(diào)里異步執(zhí)行什么操作比如先setTimeout再讀取剪貼板內(nèi)容那getAsFile()返回的可能就是null因?yàn)榧糍N板數(shù)據(jù)在事件回調(diào)結(jié)束后就會被清空。所以拿到圖片文件后立刻同步處理所有耗時(shí)的格式轉(zhuǎn)換和上傳都放到拿到File之后再做。5. 常見問題與排查技巧實(shí)錄5.1 粘貼圖片后沒反應(yīng)事件根本就沒觸發(fā)多半是綁定時(shí)機(jī)問題。確認(rèn)editor.on(paste)是不是在instanceReady之后綁的。還有一個(gè)常見原因是編輯器沒有獲得焦點(diǎn)用戶鼠標(biāo)焦點(diǎn)還在頁面其他地方粘貼事件發(fā)生在body上而不是編輯器內(nèi)部自然就不會觸發(fā)CKEditor的paste事件。解決方法是引導(dǎo)用戶先把光標(biāo)點(diǎn)到編輯器里或者你在全局document上監(jiān)聽paste再判斷當(dāng)前焦點(diǎn)是否在編輯器內(nèi)。用全局監(jiān)聽的好處是無論用戶焦點(diǎn)在那個(gè)textarea還是編輯器都能捕捉到粘貼事件然后你把圖片處理后通過insertHtml插到編輯器。這種方式我建議做成兜底方案而不是主力因?yàn)槿直O(jiān)聽會和CKEditor內(nèi)部的事件處理產(chǎn)生競爭處理不好容易重復(fù)插入。5.2 圖片上傳成功但插入編輯器后是base64這說明你只做了上傳沒攔住編輯器的默認(rèn)行為。確認(rèn)evt.data.preventDefault()是否真的執(zhí)行了。如果代碼看起來沒問題檢查一下是否綁定了多個(gè)paste事件處理器比如你項(xiàng)目里有其他插件也監(jiān)聽了paste它們可能在你之前執(zhí)行了插入邏輯。5.3 PNG透明背景轉(zhuǎn)JPEG后出現(xiàn)黑塊這是我在評論區(qū)看到最多的問題。PNG帶透明通道直接轉(zhuǎn)JPEG透明區(qū)域在JPEG格式里沒有對應(yīng)編碼GD庫默認(rèn)填充黑色。不管在前端還是后端轉(zhuǎn)JPEG之前先鋪一層白色背景。前端用ctx.fillStyle #ffffff; ctx.fillRect()后端用imagefill函數(shù)。兩個(gè)地方都做是為了防止前后端不一致導(dǎo)致某個(gè)環(huán)節(jié)漏掉。5.4 跨域上傳被瀏覽器攔截報(bào)錯(cuò)信息通常會出現(xiàn)在瀏覽器console里類似CORS policy。確認(rèn)接口文件里加了正確的Access-Control-Allow-Origin響應(yīng)頭確認(rèn)這個(gè)頭的值和前端域名完全一致包括http和https的區(qū)別。Chrome對跨域限制比較嚴(yán)格如果預(yù)檢請求沒通過不光是響應(yīng)沒有連請求都可能看不到。5.5 文件名亂碼和擴(kuò)展名異常服務(wù)端保存文件名時(shí)不要直接用原文件名尤其是從Windows復(fù)制圖片粘貼的場景文件名可能含有中文、空格甚至包含路徑信息。用日期加隨機(jī)字符串重新命名可以一勞永逸地解決這個(gè)問題。擴(kuò)展名必須根據(jù)getimagesize()識別出的真實(shí)MIME來決定不能根據(jù)前端傳的原始文件名和file.type。5.6 常見問題速查表癥狀可能原因處理方法粘貼圖片沒反應(yīng)事件綁定時(shí)機(jī)不對或編輯器無焦點(diǎn)instanceReady后再綁定光標(biāo)先聚焦編輯器插入的是base64字符串沒有攔截默認(rèn)行為確認(rèn)調(diào)用了evt.data.preventDefault()圖片上傳后黑底透明PNG轉(zhuǎn)JPEG未填白底前后端都填充白色背景跨域請求被攔截CORS響應(yīng)頭缺失或不匹配服務(wù)端加Access-Control-Allow-Origin圖片過大撐爆編輯器沒有限制寬度插入img標(biāo)簽時(shí)帶上max-width:100%保存的擴(kuò)展名和格式不一致沒有按真實(shí)MIME判斷getimagesize()識別真實(shí)格式再命名再補(bǔ)充一個(gè)很多人忽略的細(xì)節(jié)前端對圖片格式做統(tǒng)一處理時(shí)如果用戶粘貼的是一張動(dòng)圖GIFCanvas重繪會直接把動(dòng)畫幀拍平變成靜態(tài)圖。如果你的產(chǎn)品需要保留動(dòng)圖效果就得在前端判斷一下截取的圖片類型如果原始格式是GIF且尺寸合理可以考慮跳過Canvas轉(zhuǎn)換直接上傳這個(gè)需要結(jié)合具體業(yè)務(wù)場景來做取舍。5.7 一個(gè)實(shí)操上的建議前端壓縮不要過于激進(jìn)我見過一些項(xiàng)目為了提高上傳速度把圖片壓縮得非常狠質(zhì)量參數(shù)直接壓到0.5。結(jié)果用戶上傳的截圖文字模糊得沒法看又被投訴回來。粘貼的截圖最常出現(xiàn)的大問題不是體積大而是體積確實(shí)大但用戶又希望清晰。我的建議是質(zhì)量參數(shù)控制在0.88到0.92之間這個(gè)區(qū)間視覺損失極小壓縮比例又比較理想。如果尺寸超過2000px再等比壓縮基本就能滿足絕大部分使用場景又不會讓圖片丑得離譜。另外一定要在轉(zhuǎn)換函數(shù)里加入錯(cuò)誤處理分支。Canvas是瀏覽器里比較容易意外的API碰到超大圖片或者解碼失敗整個(gè)流程就會卡住。前端轉(zhuǎn)換失敗時(shí)至少要把原始文件直接上傳讓服務(wù)端來轉(zhuǎn)換而不是讓用戶站在一個(gè)永遠(yuǎn)轉(zhuǎn)圈的上傳狀態(tài)里。寫在最后的一個(gè)經(jīng)驗(yàn)關(guān)于統(tǒng)一格式這件事我想要強(qiáng)調(diào)的意識是不要指望單靠前端或者單靠后端就能徹底解決這是兩段式的工程。前端負(fù)責(zé)體驗(yàn)和初步規(guī)范后端負(fù)責(zé)安全和最終落盤。我自己的項(xiàng)目里前端把圖片統(tǒng)一成JPEG并壓縮質(zhì)量后端再用GD庫驗(yàn)一遍真實(shí)格式、做最終轉(zhuǎn)換、統(tǒng)一命名、按日期歸檔。這套方案上線運(yùn)行了接近一年基本沒再出現(xiàn)過粘貼圖片格式混亂或者透明底變黑的投訴。如果你準(zhǔn)備把方案落地建議先做一個(gè)最小可運(yùn)行的版本一個(gè)簡單的PHP上傳接口加上一段CKEditor的paste攔截腳本用不同瀏覽器分別測試粘貼截圖、粘貼文件、復(fù)制網(wǎng)頁圖片這三種最常見場景。把基礎(chǔ)鏈路跑通再逐步加上格式轉(zhuǎn)換、尺寸壓縮、跨域配置這些增強(qiáng)功能。這樣做的好處是一旦某一步出錯(cuò)你能快速定位問題出在事件監(jiān)聽、文件提取、上傳請求還是服務(wù)端轉(zhuǎn)換這個(gè)環(huán)節(jié)而不是面對一堆復(fù)雜邏輯互相干擾。希望上面的這些踩坑記錄和代碼片段能幫你少走幾步彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
自拍丝袜美腿人妻| 国产AV人人夜夜澡人人爽麻豆| 超碰97网址| 成全动漫视频观看免费下载| 五月丁香网站| 激情色图| 欧洲中文字幕| 日本人妻最新在线中| 久久精品人体AV| 日夜精品| 麻豆人妻精品一区二区| 午夜AV人气不卡| 无码乱人伦中文视频| 国产最新小视频在线播放下载| 女人的天堂大香蕉网| 天美麻花大全视频| xxxx网站亚洲精品| 一中国女人毛片水真多| 欧美十八禁在线看| 天天综合网AV91| 大香蕉78| 久久夜色一区二区| 黄色片A级一区二区三区| 99在线精品视频| 伊香蕉综合久久久久久久噜噜噜| 五月激情在线| 国产精品精品系列在线观看| 97青青操视频| 亚洲无码成人精品| 96国产精品| 99爱在线视频| 亚洲 无码 偷拍| 884t在线| 亚洲欧美国产其他二区| 91丰满| www.婷婷| 国产性爱在线视频一区二区| 国产精品97视频| 亚洲 欧美 中文 日韩超碰 | 美女天天干| 久久激情综合| 一级性爱网| 国产男女无套97| 性爱乱伦视频免费| 久久嫩草| 欧洲精品久久| 色好看av| 国产60区。| 一级黄色性爱A级片| 亚欧美综合网。| 超碰九色| AV和黑人在线播放| 久久久久夜夜夜夜| 91精品人妻一区二区三区蜜臀| 五月丁香| 久久毛卡| 欧美性爽xyxOOOO| AA特级绝黄| 成人免费视瓶| 美中韩AV综合网| 欧美亚洲综合色| 色女99一级片在线观看| 少妇精品久久久八区九区| 后入精品| se吧提供91精品国产91久久久久久 | 日韩青久久| 天天干人人乐| 久久伊人大香蕉| 超碰97起碰| 丁香五月天久久精品视频一区二区三区| 色男人色天堂东京热| 91激情国产| 东京热天堂网| 激情综合婷婷| 丝袜喷水在线| 久久九九精品一区二区| 天天做天天爱夜夜爽毛片试看| 干干干天天| A V少妇特黄三级| 激情四射五月天| 91中出视频| 九九视频黄色片| 亚洲国产麻豆一区二区三区| 一区,二区,三区网站| 91亚洲狠狠色| 免费超碰97在线观看| 99无码精品| 一区二区三区色综合| 97欧美日韩| 欧美在线观看综合国产| 八戒午夜福利理论片| 老女人综合| 天天爱天天操| 色97干| 91久热| 精久久久| 亚洲做性| 综合网少妇| 成人资源中文字幕在线观看| 91精品少妇搡搡搡| 亚洲熟女偷拍在线观看| 亚洲欧美91√| 激情色图| www.99色| 国产美女销魂在线观看不卡| 国产日韩欧美亚洲精品95| 无码高清操逼网址| 激情抓乳插进去啪啪啪日韩 | aaa亚无码专区| 久久精品国产亚洲AV先锋| 96精品久久| 欧美性夜| 永久电影三级在线观看| 亚洲乱码精品一区二区| 免费伦费视频在线观看| 日韩,欧美,中文在线| 国产精品久久久久久久毛片1| wwwxxx日本爽| 99精彩视频| 六月天婷婷| www.91色综合| 久久超碰大香蕉| 国产青青美女玩逼视频| 色香91| 欧美日韩人妻精品一区二区三区| 天美传媒婬乱| 久久99午夜精品一区人妻| 综合欧美日本三级| 岛国精品视频在线观看| 色香阁在线| 刺激性视频黄页| www.AV有限公司一区| 国产强奸91| 国产欧美日韩一区二区三区| 亚洲精品亚洲人成在线麻豆| 亚洲日韩一区电影| 粉嫩AV一区夜夜嗨| 欧美人妻一区二区| 久久成人国产精品| 美女自卫慰黄网站免费| 97视频在线观看播放与子乱对白在线……| 欧美制服网站美腿丝袜| 久久九精品| 玖玖久久久| www.亚洲黄色| 91色色色| 91美女视频电影| 亚洲色图欧美色图另类图片| 亚洲导航深夜福利| 爱欲AV| 亚洲清纯唯美| 国产操逼逼网| 麻豆区99999| 小骚逼被操的爽不爽| 美女天天干| 欧美精品精品一区二区| 亚洲欧美经典一区二区| 锕锕好爽 死我在线观看| 97视频在线观看免费高清| aaa亚无码专区| 日本在线激情一区二区三区 | 久久激情亚洲精品无码?V| 中文字幕 码 自拍 视频 区| 国产精品午夜福利视频| 欧美一二三| 国产视频不卡在线观看| 久久嫩草国产成人一区| 变态另类专区| 亚洲av综合色区无码一| 欧美熟妇乱码在线一区| 日韩有码专区| 伊人五月天| 综合激情97 | 精品丝袜无码一区二区三APP| 91九色在线| 欧美72网页| av中亚| 深田咏美亚洲精品福利社| 黄网站黄视频网站进入口| 久久久久久久久久久久色网| 亚洲和欧美裸体美女双飞视频| 蜜臀AV一区二区三区| 岛国毛片手机在线观看| 国产精品熟女九九九| 亚洲高清综合网| 在线观看黄色电话| 丰满人妻一区二区中文| 思思性爱| 精品人妻视频一区二区在线播放| 18禁美女裸体无遮挡啪啪| 欧美最婬乱婬爆婬性视频 | 日韩AV噜噜噜一区二区三区四区 | 蜜臀无码视频在线观看 | 亚洲第一免费视频| 亚洲91网。| 搡老女人911熟妇老熟女| 爆乳免费黄网站| 九九九九国产| 热久久91婷婷| 久久久性| 激情文学欧美| 人人操肉肉| 蜜臀人妻少妇久久在线观看| 国产亚洲福利第一页丝袜| 日韩pv中文| 熟女探花啪啪| 久久中日麻豆| 亚洲成人av电影在线| 久久一本大香蕉| 99精品久久久久久久婷婷| 人妻丝袜肏逼| 五月激情啪啪| 九九精品99| 97在线青| 另类视频在线| yw尤物av无码点击进入麻豆| 亚洲的天堂网| 粉嫩在线一区二区懂色| 老熟女阿 国产91| 久久婷婷一区二| 日本中文熟女视频| 天海翼久久| 十八禁视频网站| 欧美熟妇精品黑人巨大91| 欧美|91色综合| 精品无码一区二区三区色欲| 97干综合网| 妺妺跟我一起洗澡没忍住| 日韩91网| 日本 免费 一区二区三区 久久香蕉| 亚洲精品性爱片| 激情久久久| 日1区2区3区2020| 丝袜美腿欧美| AV污污污污| 亚洲欲色| 日韩亚洲97| 狠狠色丁香| 韩国三级一线观看久| 亚洲日韩久久精品一区| 国产精品久久9| 国岛片视频| 青娱乐啪啪视频| 国产精品久久久久久久久久久久久久久 | 久久精品久| 国产免费久久精品99re韩国| 久久久久久久久久久六六| 国产91av在线播放| 伊人麻豆传媒| 国产免费一区| 高树玛利亚无码流出| 日本视频一区二区三区| 成人精品无码| 热热色青青草| 91处女视频在线观看| 99热最新| 国产精品久久久久亚洲av| 国产一线二线三线av| 欧美色图天堂网m| 丰满的三级少妇欧美久久久| 久久av成人无码免费| 男人天堂资源| 中文字幕欧美日本乱码一线二线| 蜜桃精久三区| 人妻激情另类| 日本3级一区二区免费| 日韩欧美大片免费高清啪啪| 超碰导航97| 人妻少妇精品久久久| 色嘟嘟人妻天堂网| 婷婷视频网| 丝袜熟女一区二区三区| 中文字幕一区二区三区高清| 午夜一级免费毛片| 久久久新亚洲AV| 97se亚洲综合自| 综合性视频99| 97久久国产亚洲精品超碰热| 精品人妻一区二区乱码一区二区| 国产亚洲 中文欧美久久| 国产福利av精彩对白| 色欲无码人妻日韩欧美精品| 黄人人操人人操| 天天干嫩逼网| 97超碰超碰| 国产精品欧美在线观看| 91中出视频| 中文字幕第7页| 亚洲另类色综合网站| 丝袜美腿射精91| 天堂精品小草| 四虎免费视频| 国产精品丝袜在线| 欧美疯狂做爰xxxx| 日韩精品亚洲专区在线影视| 99色天堂| 日韩三级网址| 欧美性,亚州色| 日韩内射视频| 亚州综合色图| 日产123区精品免费观看| 天天舔天天日天天射| 精品人妻一区二区三区夜夜| 青青草无码视频| 热热色AV| 大香蕉综合网| 欧美一区二区三区互相| 韩国黄片aaaa| 国产激情在线| 无码9区| 嗯嗯嗯嗯啊啊啊好紧好大| 国产怡红院| 观看免费区二区三区二| 亚洲AV无码久久精品蜜桃小说| 亚洲91网。| 乱子伦一区二区三区国产精品| 91人妻久久久久久久久久久久久| 果冻传媒A片麻豆熟妇人妻| 亚洲 在线| 色综合国产在线观看| 久热影视| 亚洲精品日韩国产欧美| 精品 码产区一区二-1080P高清在线www-B029AV | 日韩91网站| 亚洲福利影院一区久久| 做爱A级亚欧| 91啪啪视频| 亚洲精品丝袜| 欧美体内射精| 嗯嗯啊啊操我| 伊人网综合在线视频| 国产福利第一视频| 日本不卡三级网在线播放| 加勒比伊人综合| 欧美亚洲今日在线| 久久首页| 丁香六月激情| 国产久久日| 精品国产99999| 亚洲一区二区三区在线激情| 伊人黄色视频免费观看| 久久精品人体| 中文字幕精品三级久久久| 超碰91在线| 国产亚洲色婷婷久久99精品91葵花宝典| 可以看的av| 色综和网| 日本一道在线播放高清| 日本一级性爱| 粉嫩AV一区夜夜嗨| 日本三级黄页| 久久精品成人一区二区三区蜜臀| 亚洲丝袜诱惑| 90后性网国产欧美| 久久久少妇诱惑精品视频| 97操| 超碰av在线| 久草男人天堂| 无码外流操逼视频| 欧美少妇大量自拍视频在线观看| 日本一级不卡一二区| 日本成人免费一区二区三区 | 2025年A片视频精品| 五月丁香影院| 在线五区| 久久久亚洲高清不打码| 插老姨肥穴| 啊啊啊啊好爽好舒服一区二区易域| 国产免费操逼| 美女91在线观看| 亚洲精品久久久久毛片A片拉屎 | 日本狂喷奶水在线播放212| 亚洲欲色9532548967一区| 精品无码产区一区二| 韩国手机不卡无码三级视频| 老鸭窝亚洲毛片| 麻豆 美女 丝袜 人妻 中文| 激情文学网伊人| 51一区二区三区| 日韩欧美aⅴ综合网站发布| 欧洲射精91| 国产精品午夜AV完会免费 | 啊啊啊啊嗯嗯嗯用力好爽| 素人伊尹大香蕉免费下载视频| 一级@啪啪视频| 精品97精品97| 国产强上视频在线观看| 一级黄碟| 操逼片中文| 天天干18禁| 夜夜爽77777| 玖色av| 俺去俺来也在线www| 国产啊v在线免费播放| 亚春色色| 综合五月婷婷| 96超碰网| 中文字幕艹艹| 人人操我人人干| 丰满人妻一区二区三区在线| 成人小说另类在线| 欧洲中文字幕| 色成人Www精品永久观看| 91色色综合| 日韩欧美国产高清视频| 1769精品一区二区三区| 精品久久9| 国产1769在线| 亚洲久久久久| 人人妻人人色| 欧美一区二区亚洲天堂| 色欧洲| 久久9精品视频| 久久久久久久久久久免费精品| 丝袜无码a片| 亚欧成人中文字幕一区| 欧美亚洲特P| 国产精品久久久久绯色| 亚洲阿v天堂无码z2018| 亚洲欧美综合图片| 日本精品88888888| 国产亚洲色婷婷久久99精品91葵花宝典| 欧美色蜜桃97| 蜜奶av| 99热只有这里有精品| 欧中美三级一区二区三区| 久操大香蕉手机视频在线看| 人人看人人插| 亚洲第一视频 欧美风情 日韩| 午夜精品一区二区三区三上悠亚| 欧美自拍偷拍综合图片| 青青草色AV| 美女的肌被草喷水视频| 日本在线播放不卡一区| 美女诱惑一区| 精品综合久久久久久97| 亚洲一二三精品久久网| 黄色性爱网网| 自拍内地三级在线观看| 国产精品另类一区大香蕉| 夜夜操91744565| 精品v日韩欧美国产| 中文字幕欧美日韩三级| 久9爱经典视频| 污到发麻的视频 国产| 日韩免费看黄片| 日韩性爱一级片| 亚州五月| 色妇91| 一个人在线看的黄色电影网站| 国产亚洲精品av一区| 亚洲毛片基地专区| 亚洲清纯综合| 久久宗合亚洲| 99re在线观看| 天美麻豆精品视频99| 天天天天天天天天天天干美女| 粉嫩av在线| 久久亚洲一区二区色婷婷| 国产美女激情| 97超碰免费人人性爱| 小草三级久久观看| 久久免费精彩视频| 高清国产av无码| 亚洲AV噜噜狠狠网址蜜桃动漫| 成人羞羞视频国产| 91bbbbbb| 欧美色亚洲色| 精品无人区麻豆乱码1区2区图片| 色眯眯av| 国产精品久久久久久久久久梁医生| 国产91丝袜 在线播放| 无毛精品| 久久久久久久综合,国产| 麻豆伊人网| 色爱综合网欧美| 亚洲精品色| 欧美熟女激情| 国产传媒一区日韩| 成人久久精品| 亚洲在高跟鞋自慰久久在色线| 日韩熟女精品无码专区一区二区| 天美麻豆精品视频99| 色99视频| 超碰97 线线 在现| 亚洲啪啪性视频| 97久久久久| 狠狠中文字幕| 最新国内自拍av免费| 亚洲美女 晚间男人天堂 | 国产网红精品| 97亚洲自在精品在线观看| 成人午夜无码视频| 国产精品久久| 国产日韩人人| 91一起操| 国内毛片热久久思思热| 色欧洲97| 天综合网| 中文字幕123| 美女91AV| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 亚洲九区| 日本黄色精品专区网站| 日本性一区| 青青网三级视频| 少妇啪啪自拍| 91久| 经典丝袜一区| 国产按摩一区二区三区| 强奸乱伦AV网站| 天堂性色| 综合激情一一91| 性爱动态120秒| 26uuu性| 精品国产AV一区天美传媒| 97视频在| 国产精品一区二区三区在线密挑| 在线一道啪| 欧美超碰在线| 99热国产精品| 丰满搜索结果 -第18页- 久久高清无码 | 99熟女| AV和黑人在线播放| 欧美v日韩v亚洲v最新在线| 天欧美在线| 午夜呻吟欧美| 国产av尤物| 久久久久九九九| 欧美Ⅴ性爱| 人人妻人人爽人人精品| 欧美亚洲国产日本在线,久久精品国产| 亚洲丁香花色| 免费av大片| 天天操天天射天天日| 亚洲不卡三级手机播放| 精品无码少妇| 超碰偷拍| 蜜臀久久99'精品久久久| 91国产大片| 欧美中文字幕男人天堂久久精品| 色99色| 亚洲无线码一区国产欧美国| 成人精品一区二区91毛片不卡| 青青草福利视频| 激情综合 婷婷五月 红杏 | 韩国一级做A片免费的| 伊人丁香五月婷婷| A一区片| 天天干人人看综合| 亚洲精品97| 亚洲高清自拍| 久久精品人妻一区| 99久久精品国产系列| 好爽视频在线观看视频 | 九九热在线视频| 亚洲操人| 狠狠干,狠狠操| 国内毛片无码一级毛片| 色婷婷亚洲婷婷| 蜜乳av首页| 中国亚洲呦女专区| 97视频在线视频| 99久国产精品午夜性色福利| 大稥蕉免费视频这里只有精品| 激情文学亚洲| 亚洲码专区| 亚洲国产青青| 99在线无码精品秘 入口黑人| 自拍丝袜美腿人妻| 一级性爱视频免费在线| 岛国小电影| 2019天天干| 95人妻爽爽人人做人人澡| 男人天堂毛片| 黄网在线播放| 中国91AV| 水澄无码AV| 欧美人妻少妇| 中文字幕视频在线观看一区二区| 亚洲久久久| 天天综合网一91网| 国产精品不卡高清在线观看| 国内精品不卡无毒99999| 少妇久久久久| 久久精品免费| 免费?级毛片无码?∨蜜芽试看| 日韩欧美成人大香蕉| 狠狠婷婷亚洲中文综合久久| 91女人的网站| 八戒午夜福利理论片| 国产AV人人 夜夜人人澡| 国产不良强奸视频免费看| 黑人中出21连凳花野真衣| 亚洲人体视频在线观看| 日韩精品操少妇| 免费亚洲黄色视频在线观看| 综合色久欲| 另类图片五月天| TS人妖另类精品视频系列| 特级大荫道BBwBBwBBW| 国产精品嫩草影院午夜两性| 久久日本熟妇熟色高清| 国产精品一区二区 尿失禁| 久久久免费高清中文视频| 日韩久久三区| 日本成人免费一区二区三区| 一区二区三区成人| 国模吧 一区二区三区| 一本色道综合久久欧美日韩精品| 精品人妻一区二区免费蜜桃| 强歼乱伦资源网| 九九热精品视频六| 黑人中出21连凳花野真衣| 91c色| 欧美亚洲手机在线| 啊啊啊啊操死我了| 99热啪啪| 久久久久久久久久久免费精品| 欧美一区二区三区成人性生活| 五月天激情影院| 国产二区三区免费视频| 97国产精品久久久久 | 思思热免费视频观看| 好爽视频在线观看视频| 使劲用力艹少妇视频一区二区| 欧美性生活综合| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日本不卡码黄色 | 国产美女在线精品免费看| 在线情色电影 91大 | 美女被艹尤物视频| 中文字幕黄片在线| 91精品黄在线观看| 天天看特黄的免费网站| 欧美岛国精品在线观看| 99re6久热只有精品6在线直播 | 中国女人内射6XXXXX| 欲射影视| 人妻丰满熟妇一区二区三| 伊人大香蕉在线| 97色碰| 熟妇熟女视频一区二区三区| 亚洲交性| 91男女啊啊啊| 操逼网站网站| 欧美丝袜激情| 秋霞网—男女啪啪亚洲免费体验区| 国产黄a三级三级三级av在线看 | 大香蕉免| 午夜国产乱伦视频| 精品网站99999| 377p欧洲日本亚洲大胆| 97精品97久久| 最近的最新的中文字幕视频| 超碰97人人乐| 色情综合网| 美女91AV| 丝袜综合| 成人aⅴ一区二区三区| 伊人四虎综合| 桃色五月天| 操碰97| 午夜精品久久久久久久99热影院 | 天天操美美| 欧美强奸一区二区诱惑| 床戏久久久av一区二区麻豆| 天天流夜夜操| 日本国产亚洲一区在线观看| 超碰夫妻97| 国产一区二区三区精品观看啪| 天天天干977| 激情四射婷婷四五月天| 操婢日韩| 欧美男人的天堂| 麻豆国产av网| 日本视频在线观看污污污| 1204人成网站色www| 大香蕉碰| 国产 亚洲 丝袜 制服| 一本大道青青| 欧美一区二区三区大综合| 成年女人黄网站| 久久东京热成人| 亚洲码和欧洲精品激情系列| 乱伦Av网| 一级一性爱免费视频| 亚洲综合贴图91| 丝袜美腿诱惑亚洲欧美视频在线观看 | 日韩性爱免费观看视频| 俺也射| 国产精品九9| 国产尤物AV尤物在线观看不卡| 本道综合精品| 天天色踪合| 天天影视综合网欧美精品| 99精品视频在线观看免费| 亚洲无码一区成人免费午夜| 青青草视频在线观看一区二区| 首页中文字幕中文字幕免费| 精品人妻一二三| chaopen97久久| 久婷婷一区| 一本道综合色图| 国产福利精品98视频| 天天综合官网| 久久久久久人妻一区精品色欧美| 盗摄女人妻在线| www.五月天| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产欧美精选自拍一区| 五月天婷精品激情| 久久超碰爱| 日本黄色裸日本黄色裸体 | 有码人妻系列| 欧美日韩中国x| 天堂综合网| 久久久久久电影| 国产日比| 精品96久久| 日本 情色 1区| 成人av毛片在线观看| 欧美精品23| 天天色,天天干,天天干| 国产热RE99久久6国产精品首| 欧美午夜精品久久久久久3D | 日韩三四五区| 蜜臀av中文字幕| 色99999| 午夜福利视频在线一区| 污到发麻的视频 国产| 国产后入清纯| 粉嫩av平台| 婷婷综合五月| 超碰碰激情97+久| 久久久四区| 亚洲图片欧洲图片aⅴ| 欧美综合骚| 中文字幕av片| 色色网91| 午夜精品99久久久久传媒| 综合情欲网| 亚洲性爱电影| 久久99国产综合精品女同| 国产av色网| 飘花国产午夜精品不卡| 91天天日| 91情色在线| 性爱乱伦网址| 国产天美传媒精品| 午夜舔阴达高潮视频免费看| AV电影在线播放| 九九九九九九九九九九九九九九九女| 神马久久久久| 99免费在线视频| 大香交| 高清成年美女黄网站免费大全 | 色色色网站| 综合情欲网| 亚洲精美粉嫩嫩泬在线观看| 久久最新视频免费观看| 精品国产Av无码久久久伦古装| 柠檬AV导航| 伊人少妇久久久| 久久黄色视频一区二区三区 | 91女网站| 欧美天天| 日韩国产品视频中文字| 色香综合| 日韩乱码Av| 超碰97亚洲| 久久天天摸| 91天天| 青青11操操操操操操操操| 人妻91少妇| 九九热在线精品视频| 欧美天天影院| 五月天综合| 色香综合| 日韩美女久久一区二区三区| 97人人射| 97AV在线观看| 欧美三级一级| 亚洲无码超碰免费| 婷婷另类小说| 日操粉逼逼| 熟妇无码视频三区| 婷婷五月天av| 伊人操| 精爱久久| 久久久久亚洲AV无码专区少妇| 欧美夜夜骑视频| 八人操人人摸人人看| 97jingpin| 99超级碰免费视频| 欧洲精品一级二级精品综合视频综合| 野狼激情网| 日本人妻伦在线中文字幕| 日日夜夜国产综合| 欧美经典一区二区三区| 青青草原成人| 中文字幕一区 二区三四五 区日 日骚| 女性91网站| 97久久免费| 日本一级二级三级网站| 熟女91网站| 成人AV素股で擦久久| 中文字幕人成乱码熟女香港| 四虎影视永久在线观看精品免费网站| 欧美日综合| 国产精品不卡av免费在线观看| 欧美曰韩国产精品| 全球成人中文在线| 亚洲日韩电影| 青青草成人视频在线观看二区| 人人干人人操人人..com| 伊香蕉综合久久久久久久噜噜噜| 精品国产网站| 日韩黄色一区二区三区| 国产三级片在线观看| 久久精品老司| 久久99网站| 18禁无码永久免费无限制| 啊啊啊啊啊啊啊啊要喷了| 99精品无码| 日韩激情毛片一级久久久| 亚洲Av噜噜一区二区三区妖精| 国产精品激情久久久久久久| 欧美 日韩第一性色| 91在线视频免费中出| 亚洲二区精品在线观看| 亚洲加勒比久久日本道| 欧美国产操逼| 日韩AV中文字幕电影| 黄片不用下载在线观看| 在线毛片片免费观看| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 高清国产无码av| www.人人摸在线视频| 久久久亚洲精品电影免费看| 国产一区二区三三视频| 大香蕉日亚洲日本亚大 | 久久久无码国精品无码三区三区| 韩国一级婬片A片无码天美 | 97视频620| 亚 欧 美 综合| 全球成人中文在线| 乱伦色图网址是多少| 特色a在线上| 亚洲91射| 国产日韩欧美| 久久成年精品| 熟女丰满人妻一区| 亚洲激情AV| 久久精品国产亚洲AV无码电影| 1000部熟女视频在线观看| 亚洲午夜精品久久久中文影院| 伊人久久亚洲中文字幕不卡| 狼人综合婷婷激情四射 | 久久久久亚洲一区女同性恋中文字幕| 午夜免费视频1000| 成人av动漫在线观看| 国产成人精品无码久久| 久久 国产 无码| 中文字幕在线观| 亚洲av资源| 懂色AV网| 超碰欧美COM| 久久久性少妇| 伊人网一本| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 超碰这里有精品| 久久超碰免费的| 高清不卡一二三区视频......| 亚洲成人碰碰| 日韩啪啪啪啪啪| 九九色综合| AA丁香综合激情| 91九色精品熟女内射| 人人干人人搞人人摸| 日韩人妻 中文字幕| 综合欧美激情网| 亚洲精美粉嫩嫩泬在线观看| 国产亚洲女v在线观看| 欧美偷拍区| 日韩人妻制服丝袜av| 中国一级操逼视频| 日韩欧美国产一区二区三区四区| 懂色av色欲av蜜臀av| 视频黄色国产一级| 夜间福利片1000无码| 亚洲色图日韩精品| av天堂手机版追回| 色5月婷婷| 亚洲春色激情小说| 久久的网站啊啊啊啊啊| 99re8超碰| 91爱看| 精品一区二区久久| 亚洲精品 欧美97色色| 久久久精选| 亚洲欧美情色| 国产精品嫩草影院午夜两性| 18禁中文字幕| A 天堂在线观看视频| www.色操逼| 人妻啊啊人妻啊| 60秒试看最爽10分钟网站| av东京热男人的天堂| 欧美爱国产综合、| 东京热男人天堂| 欧洲黄色网| 最新的亚洲无吗| 亚洲精品三| 九久久九精品视频| 91精产一区二区三区| 91蜜桃传媒精品久久久一区二区| 91精品国产91熟女| 日韩精品资源专区二区| 国产AV毛片| 欧美成人都市人妻| a人欧美综合天堂麻豆| 中文无线日韩一区| 久久六六| 国产无马视频| 禁片 高清 在线观看视频网站| 天天综合网在线| 综合大香蕉美。| 色牛aV| 日韩激情中文字幕有码| 国产一区二区三区中文字幕| 亚洲人妖网| 啊啊啊骚| 在线综合 亚洲 欧美中文字幕| 国产AV高清AV无码| 夜夜操av亚洲一区二区| 91劲爆| 丰满人妻被猛烈进入中| 久久久久国产精品片区无码直播| 欧美夜夜狠| 91无摭挡| 蜜乳中文字幕a在线| 无码聚合| 亚洲一区二区三区麻豆传媒| 我爱操| 国产亚洲精品美女久久久| 成人看片网站| 69久久久久久久久久久久久| 欧美日韩中文视频播放| 国模无码一区二区三区在线| 国产夫妻一区二区| 好湿好紧视频| 不卡一区二区日本视频| 久久欧美1卡2卡3| 精品免费成人久久| 亚洲伊人a线观看视频| 亚州情色j区| 久久精品操| 神马久久久久久伦理片| 91人妻超碰| 亚洲深夜福利| 日韩成人精品视频自拍| 午夜成人福利影视| 91色香| 成人精品在线观看| 免费看国产大AB| 370p日韩欧美亚洲精品| 精品国产嫩穴视频| 大香久久| 噜噜噜无码AV一级一级久久影院| 日韩av色图| 亚洲黄片免费在线播放| 夜夜爽77777| 久久久久久久人妻| 黄色十八禁| 亚洲AV成人在线| 日韩不卡网操逼中文字幕日韩| 日本一区二区中文字幕久久| 色婷婷小说| 玖玖资源视频一区二区三区| 日韩亚洲国产视频| 97精品视频网站| 伊人精品久久网站| 亚洲高清视频在线观看| 日本一区二区中文字幕久久| 人妻天堂综合网| 久久中文字幕在线观看| 欧美日韩99| 午夜啊啊| 激情五月天婷婷| 欧美色老汉| 69精品久久久久中文字幕| 免费看污网址| 影音先锋少妇| 中文字幕日韩人妻视频一区二区三区交换夫妻| 中英熟女操女| 97激情97激情| 91视频伊人| 日韩78m视频| 91在线视频免费播放| 97精品国产精品免费观看| 国产曰批免费观看久久久| 天天天天天天天天综合| 精品人妻一区二区视频| 97爱碰| 婷婷AV一区二区三区| 在线洲亚线| 日韩人妻大香蕉| 久久亚洲AV无码白度| 久艹伊人精品综合在线| 国产极品精品美女视频| 91男人天堂网| 激情久久av一区av二区av| 91情色在线| 人妻碰碰碰碰碰碰| 奇米四色网| 亚洲91大片| av资源在线播放天堂| 一本久道久久综合狠狠爱一密臀精| 涩涩五月天| 20cm女自慰在线日韩欧美| 偷拍超碰| 亚洲成A∨人影院在线欢看| 96超碰网| 婷婷综合在线观看| 啪啪AV导航| 色欧美在线| 日韩欧美加勒比| 国产亚卅97| 每日更新AV| 四方色播| 亚洲AV无码久久精品蜜桃小说| 国产亚洲精品美女久久久久久2021| 熟妇女伦乱视频视频| 成人资源中文字幕在线观看天天| 成人午夜高潮av猛片| 美女让帅哥通她小鸡鸡| 屌色在线97视频| 嫩草在线视频| 欧美热图99| 日韩av色图综合| AV电影在线播放| 亚洲无码成人精品| 97色欧洲| 国产精品suv一区| 亚洲va综合va国产va中文| 国产三级在线现体验区| 黄页网站成人免费| 涩爱AV在线| 五月丁香六月婷| 国产精品人人爽人人做可爱福利| 高潮9999外国| 中国黑人三级片网站上区| 九九色精品| 欧美日韩国产黄色片| 青青草好吊色| 精品人妻伦一区二区三区久久| 亚州宗合另类| 手机看av网站在线看| 麻豆国产97在线| 91欧美www| 在线情色电影 91大| 日韩美脚一区二区网站| 丰满人妻一区二区三区大胸懂色 | 天欧美在线| 大香蕉天天看妹子| 九九AV| 乱伦3P视频| 无码免费在线观看黄色片| 春色综合网| 天天干1区2区在线| 一区二区三区蜜桃成人撸久久东京热| 色综合色| 国产成人无码高清| 可以在线观看的黄色网址| 在线a亚洲视频播放在线| 国产综合久| 激情久久日韩精品中文字幕麻豆| 色好看av| 欧美综合骚| 九九亚洲| 欧美一级A片在线看视频性色| 草莓精品视频在线免费观看| 超碰在线一区二区| 欧美综合中文| 中文字幕av一区二区三区人妻少妇 | 五月综合激情| 静品嫩模一区二区| 日本一区二区三区四区免费观看| 欧美成年人性爱视频免费观看| 国产精品夜夜| 中国少妇啪啪视频| 蜜桃天美传媒AV一区二区三区| 色综合20p| 久久99草| 亚洲区限制级| surenchaopeng| 蜜臀AV成人精品蜜臀| 亚洲AV资源| 国内精品不卡无毒99999| 亚洲激情网一二三四区| 色九区| 婷婷色色五月天| 五月天综合| 开心五月深爱五月| 天天做天天爽| 成人欧美一区二区三区黑人一| 国产欧美日韩在线不卡第一页| 国产亚州精品美女久久久免费| av在线免费一区二区| 欧美另类综合久久| 黄页视频网站野外| 日本性爱网址| 人、人、摸,人、人、草| 激情五月天丁香社区| 欧美在线播放aaaa| 99精品久久| 国产11页| 亚洲国产一区二区三区在线 | 九九热男人天堂| 成年男人的天堂| 欧美在线啊啊啊| 中文字幕一区二区三四五区日日骚| 亚洲日韩少妇一道本视频| 欧美九一精品久久久熟妇| 亚洲加勒比| 日本一区二区电影网站| 亚洲av在线免费观看| 素人美腿视频网站| 青青草大香蕉在线视频| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 黄色免费一级在线毛片| 国产精品久久久久久亚洲色欲| 99久久精品无码一区二区毛片免费| 亚洲另类小说卡通动漫| 国产成人免费观看在线视频| 探花精品视频| 亚洲日韩肥臀视频在线观看| 日本精品国产视频| www.av不卡中文字幕| 91亚洲网站| 翔田千里无码一区| 十八禁的黄污污免费网站| 噜噜吧,噜噜色,噜噜| 啪啪91| 九九九九九九九九九五码| 日本97久久| 中文字幕三四区| 岛国视频一二三区| 国产99 中文字幕日韩小视频| 婷婷四五区| 人妻免费观看| 九色视频91| 亚洲天堂,男人| 欧美久久婷婷| 亚洲资源吧| 国产欧美日本亚洲精品| 国产又大又硬又长又粗| 超碰超碰欧美| 天天躁夜夜躁狠狠躁AV|