摘要:讀取文件文件對象加載圖片圖片地址的圖片轉圖片轉圖片對象圖片質量到之間縮放比例到之間超過這個值無法生成,在上方式一低版本兼容性差些文件類型文件大小質量大小方式二文件類型文件大小質量大小上傳上傳的地址文件對象處理上傳進度上傳中反饋
* @Date: 2016/11/17 0017 * @Time: 10:14 * @Author: lxbin * * Created with JetBrains WebStorm. */ /** * http://leonshi.com/2015/10/31/html5-canvas-image-compress-crop/ * http://jafeney.com/2016/08/11/20160811-image-upload/ * http://ilovetile.com/3506 */ /** * 讀取文件 * @param file 文件對象 * @return {Promise} */ function readFileAsync(file) { return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = e => resolve(readFile.target.result) reader.onerror = e => reject(new Error("Could not read file")) reader.readAsDataURL(file) }) } /** * 加載圖片 * @param url 圖片地址 * @return {Promise} */ function loadImageAsync(url) { return new Promise((resolve, reject) => { const image = new Image() image.onload = () => resolve(image) image.onerror = () => reject(new Error("Could not load image at " + url)) image.src = url }) } /** * base64的圖片dataUri轉Blob * @param dataURI * @return {*} */ function dataURItoBlob(dataURI) { // convert base64 to raw binary data held in a string // doesn"t handle URLEncoded DataURIs - see SO answer #6850276 for code that does this const byteString = atob(dataURI.split(",")[1]); // separate out the mime component const mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0] // write the bytes of the string to an ArrayBuffer const ab = new ArrayBuffer(byteString.length); const ia = new Uint8Array(ab); for (let i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } // write the ArrayBuffer to a blob, and you"re done return new Blob([ab], {type: mimeString}); // Old code // const bb = new BlobBuilder(); // bb.append(ab); // return bb.getBlob(mimeString); } /** * 圖片轉Blob * @param image 圖片對象 * @param quality 圖片質量(0到1之間) * @param scale 縮放比例(0到1之間) * @return {Promise} */ function imageToBlob(image, quality, scale) { return new Promise((resolve, reject) => { try { let canvas = document.createElement("canvas") canvas.width = image.naturalWidth * scale canvas.height = image.naturalHeight * scale while (canvas.width >= 3264 || canvas.height >= 2448) {//超過這個值base64無法生成,在IOS上 canvas.width = canvas.naturalWidth * scale canvas.height = canvas.naturalHeight * scale } let ctx = canvas.getContext("2d").drawImage(image, 0, 0, canvas.width, canvas.height) //方式一:低版本兼容性差些 //canvas.toBlob(function (blob) { // console.group("[Leo]file compress to blob") // console.log("文件類型 => " + image.type) // console.log("文件大小 => " + (image.size / 1024 / 1024).toFixed(2) + "M") // console.log("blob質量 => " + quality) // console.log("blob大小 => " + (blob.size / 1024 / 1024).toFixed(2) + "M") // console.groupEnd() // resolve(blob) //}, "image/jpeg", quality) //方式二: const base64 = canvas.toDataURL("image/jpeg", quality); const blob = dataURItoBlob(base64); blob.name = blob.filename = image.name console.group("[Leo]image compress to blob") console.log("文件類型 => " + image.type) console.log("文件大小 => " + (image.size / 1024 / 1024).toFixed(2) + "M") console.log("blob質量 => " + quality) console.log("blob大小 => " + (blob.size / 1024 / 1024).toFixed(2) + "M") console.groupEnd() resolve(blob); } catch (e) { reject(new Error("Image could not convert to blob :" + e)) } }) } /** * Ajax上傳 * @param uri 上傳的Action地址 * @param file 文件對象 * @return {Promise} */ function uploadFile(uri, file) { return new Promise((resolve, reject) => { let xhr = new XMLHttpRequest() if (xhr.upload) { xhr.upload.addEventListener("progress", (e) => {// 處理上傳進度 if (e.lengthComputable) { let percent = (e.loaded / e.total * 100).toFixed(2) + "%" console.log("上傳中(" + percent + ")"); //TODO:反饋到DOM里顯示 } else { console.log("unable to compute"); } }, false) } xhr.onreadystatechange = (e) => {// 文件上傳成功或是失敗 if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText)// 上傳成功 } else { reject(xhr.responseText)// 上傳出錯處理 } } } xhr.open("POST", uri, true)// 開始上傳 let form = new FormData() form.append("filedata", file, file.name) xhr.send(form) }) } /** * 上傳文件 * @param file 文件對象 * @param quality 圖片質量(0到1之間) * @param scale 縮放比例(0到1之間) */ export default async function fileUpload(file, quality, scale) { try { let fileUrl = await readFileAsync(file) let image = await loadImageAsync(fileUrl) image.name = file.name let blob = await imageToBlob(image, quality, scale) let upload = await uploadFile(blob) return upload } catch (e) { console.log("file upload failed") } }
http://leonshi.com/2015/10/31...
http://jafeney.com/2016/08/11...
http://ilovetile.com/3506
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80936.html
摘要:哈哈主要還是我嫌麻煩四上傳圖片這里的頁面樣式,圖片壓縮和預覽都和上面一樣,這里我主要配置一下的,讓接口能夠成功上傳。如果想讓用戶有更好的體驗,可以對圖片進行一下壓縮和本地預覽。 一、通過Form表單提交上傳 HTML enctype屬性必不可少 上面一種方法通過表單自有屬性進行提交,看似簡單,但是也有其最大的缺點,那就是提交...
摘要:哈哈主要還是我嫌麻煩四上傳圖片這里的頁面樣式,圖片壓縮和預覽都和上面一樣,這里我主要配置一下的,讓接口能夠成功上傳。如果想讓用戶有更好的體驗,可以對圖片進行一下壓縮和本地預覽。 一、通過Form表單提交上傳 HTML enctype屬性必不可少 上面一種方法通過表單自有屬性進行提交,看似簡單,但是也有其最大的缺點,那就是提交...
摘要:環境,這里的指到實例一圖片壓縮文件類型是圖片格式,文件壓縮后對象,,容器或者回調函數開始讀取指定對象中的內容讀取操作完成時返回一個格式的字符串開始壓縮利用數據化圖片進行壓縮圖片轉指到默認按比例壓縮默認圖片質量為生成創建屬性節點圖像質量值越 *vue+webpack環境,這里的that指到vue實例 一、圖片壓縮 /* file:文件(類型是圖片格式), ...
摘要:圖片文件大小減小后,上傳速度自然會提升,在同樣的并發下,后臺處理的速度也會得到提升,用戶體驗得到提升。 這是一個很簡單的方案。嗯,是真的。 為什么要這么做? 在移動Web蓬勃發展的今天,有太多太多的應用需要讓用戶在移動Web上傳圖片文件了,正因如此,我們有些困難必須去攻克: 低網速下上傳進度緩慢,用戶體驗差 高并發下,后臺處理較大的上傳文件壓力大 或許有更多... 在攻克上面的一些...
摘要:上傳的文件經過就可以實現預覽圖片了,這方面不清楚的可以查看進階系列文件上傳下載旋轉旋轉需要用到的方法。 前言 在手機上通過網頁 input 標簽拍照上傳圖片,有一些手機會出現圖片旋轉了90度d的問題,包括 iPhone 和個別三星手機。這些手機豎著拍的時候才會出現這種問題,橫拍出來的照片就正常顯示。因此,可以通過獲取手機拍照角度來對照片進行旋轉,從而解決這個問題。 Orientatio...
閱讀 2449·2021-10-08 10:17
閱讀 1824·2021-09-06 15:02
閱讀 2539·2019-08-29 17:30
閱讀 2663·2019-08-29 13:24
閱讀 1522·2019-08-29 11:12
閱讀 3337·2019-08-28 17:52
閱讀 666·2019-08-26 11:30
閱讀 3577·2019-08-26 11:01