引言

本来我的网站的图片直接上传到服务器后,再进行压缩的

但我发现,在php默认配置的情况下,文件最大上传的大小只有2M

可现在手机,随随便便拍出来,都是超高清了呀,起码都有个3M,5M的,这一上传就显示上传失败

原因就是太大了,直接被服务器拒绝了,连上传程序都没走到。

所以,我结合了之前的那个想法,打算在网站前端进行图片压缩,这样既不会影响网站后端处理速度,又能够上传任意大小的文件。

实现

这里用了个js的函数,作为图片压缩的核心代码

let maxSize = 120*1024; async function compressImage(file) { return new Promise((resolve) => { const img = new Image(); img.src = URL.createObjectURL(file); img.onload = () => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); let width = img.width; let height = img.height; let quality = 0.9; function compress() { canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0, width, height); canvas.toBlob((blob) => { if (blob.size <= maxSize) { // 将 Blob 对象转换为 File 对象 const compressedFile = new File([blob], file.name, { type: file.type }); resolve(compressedFile); } else { quality *= 0.9; width *= 0.9; height *= 0.9; compress(); } }, file.type, quality); } compress(); }; }); }

构建了一个Promise对象,不断递归压缩图片,将图片的宽、高、精度,都乘以0.9,这样做不断的压缩

直到图片总大小达到设定的大小,才返回到外部

压缩后大小

压缩后大小


欢迎关注拓行公众号,分享各种技术博客文章

拓行——奋勇进取,开拓未来,砥砺前行

最后修改:2025 年 06 月 27 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~