1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| const ACCEPT = ["image/jpg", "image/png", "image/jpeg"]; const MAXSIZE = 1024 * 1024 * 3; const MAXSIZE_STR = "3MB";
function convertImageToBase64(file, cb) { let reader = new FileReader(); reader.addEventListener("load", function (e) { const base64Image = e.target.result; cb(base64Image); reader = null; }); reader.readAsDataURL(file); }
function compress(base64Image, cb) { let maxW = 1024; let maxH = 1024; const image = new Image(); image.addEventListener("load", function () { let ratio; let needCompress = false; if (maxW < image.naturalWidth) { needCompress = true; ratio = image.naturalWidth / maxW; maxH = image.naturalHeight / ratio; } if (maxH < image.naturalHeight) { needCompress = true; ratio = image.naturalHeight / maxH; maxW = image.naturalWidth / ratio; } if (!needCompress) { maxW = image.naturalWidth; maxH = image.naturalHeight; } const canvas = document.createElement("canvas"); canvas.setAttribute("id", "__compress__"); canvas.width = maxW; canvas.height = maxH; canvas.style.visibility = "hidden"; document.body.append(canvas); const ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, maxW, maxH); ctx.drawImage(image, 0, 0, maxW, maxH); const compressImage = canvas.toDataURL("image/jpeg", 0.9); cb(compressImage); const _image = new Image(); _image.src = compressImage; document.body.appendChild(_image); canvas.remove(); }); image.src = base64Image; document.body.appendChild(image); }
function uploadImage(compressImage) { console.log("upload image to server...", compressImage); }
const upload = document.getElementById("upload"); upload.addEventListener("change", function (e) { const file = e.target.files[0]; console.log(file); if (!file) { return; } const { type: fileType, size: fileSize } = file; if (!ACCEPT.includes(fileType)) { alert("不支持上传该格式文件!"); upload.value = ""; return; } if (fileSize > MAXSIZE) { alert("文件超出" + MAXSIZE_STR + "!"); upload.value = ""; return; } convertImageToBase64(file, (base64Image) => compress(base64Image, uploadImage) ); });
|