网址导航网首页

嗨,欢迎来到25Qi网址导航

站长QQ:2598903095

SEO学习

前端图片压缩上传:减轻服务器压力的实现思路与代码

时间:2024-09-28 丨 作者:25QI导航 丨 关键词:上传图片过大怎么处理

在前端开发领域,图片上传操作颇为常见。然而,若上传文件过大,服务器将承受巨大压力。鉴于此,我们必须对图片进行压缩以确保上传顺利进行。本文将探讨这一技术,揭示我们实现的方法。

一、选择图片,准备开工

为确保用户能从本地上传图片,操作简便:仅需在input元素中指定type为"file",附加accept属性以指定仅接受图片格式。之后,绑定input元素的change事件,以便用户选择图片后即启动处理过程。

设想用户兴致勃勃挑选大图,却遭遇服务器停滞,颇感失望。因此,需在用户选中图片时即刻启动压缩流程,以确保上传流程顺畅。

二、图片变数据,base64来帮忙

需将用户上传的图像文件资料转换为base64编码数据。此过程类似将一幅大幅图像转化为长序列密码,便于后续处理。

采用base64编码的原因在于,它不仅便于传输信息,同时有效压缩图片文件大小。尽管编码转换会带来些许资源消耗,然而这些额外成本是优化后续压缩效果的必要投入。

三、画布登场,压缩开始

上传图片说太大怎么办_上传图片超出大小怎么办_上传图片过大怎么处理

目前,已获得图片的base64编码,即将进入压缩核心步骤。构建一个canvas元素,相当于一个绘图板,用于实施图片大小压缩,并将处理后的图像渲染至其表面。

将用户上传的图片比作巨幅油画,经canvas画布处理后,缩至便于墙上挂置的尺寸。此举既节省空间,亦增添画面细腻度。

采用Canvas的toDataURL函数,可导出绘制的图像为压缩型数据格式。此函数需指定两个参数:数据输出类型及压缩率。这两项参数的调整,赋予我们调整图像压缩效果的灵活控制权。

四、压缩完成,上传走起

对压缩数据进行相应处理,如上传至服务器。此时,你会发现,重型图片文件显著瘦身,上传效率亦大幅提升。

想象一下,图片上传速度由几分钟缩短至几秒,这不仅优化了用户体验,亦减轻了服务器压力,成效显著。

五、总结与反思

经过一系列操作,我们高效完成了图像的压缩及上传任务。此举不仅优化了用户上传过程,还增强了服务器对高流量处理的适应能力。

上传图片超出大小怎么办_上传图片过大怎么处理_上传图片说太大怎么办

未经图片压缩,服务器处理海量大型图像风险崩溃,用户上传速度缓慢,体验不佳。现优化后,流程有序,用户满意,服务器负载减轻。

六、未来展望

自然,图像压缩仅系前端开发的枝节举措。展望未来,我们将拓展更多优化路径,例如采纳更高效压缩技术,或在客户端实施深度预处理。

未来前端开发有望实现智能化,自动识别并优化图片尺寸及类型,从而提升开发效能并优化用户体验。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="ipt" type="file" accept="image/jpg, image/png, image/jpeg" />
    <p id="exponent"></p>
    <script>
        //选取DOM元素
        const ipt = document.getElementById("ipt");
        const exp = document.getElementById("exponent")
        //设置图片最大上传尺寸,根据需求来,这里设置为最大1M
        const MAXSIZE = 1024 * 1024;
        //监听input的change事件
        ipt.addEventListener('change', (e) => {
            const [file] = e.target.files; //可以获得上传的文件信息
            if(!file) {
                return
            }
            const {type:fileType, size:fileSize} = file; //得到上传文件的大小和类型
            //图片压缩处理
            convertImageToBase64(file,(base64Image) => compress(base64Image,uploadImage));
        })
        //首先将图片转为base64格式,两个参数,需要转换的文件 回调函数
        function convertImageToBase64(file,callback) {
            let reader = new FileReader();
            reader.addEventListener('load' , (e) => {
               const base64Image = e.target.result  //这里是得到的base64数据
                callback && callback(base64Image); //回调函数去处理得到的base64数据
                reader = null;  //将reader指向null,便于浏览器回收
            })
            reader.readAsDataURL(file);
        }
        //对base64数据进行压缩的函数
        function compress(base64Image,callback) {
            //设置图片的最大宽和高,根据实际需求来定
            let maxW = 1024;
            let maxH = 1024;
            //将得到的base64数据赋值给一个图片对象,以获得图片的宽高
            const image = new Image();
            image.addEventListener('load', (e) => {
                let ratio; //图片压缩比
                let needCompress = false; //是否需要压缩
                //maxW < 图片实际宽度时走这里
                if(maxW < image.naturalWidth) {   //image.naturalWidth获取图片实际宽度
                    needCompress = true;  //需要压缩
                    ratio = image.naturalWidth / maxW;  //得到压缩比例
                    maxH = image.naturalHeight / ratio; //同比缩放maxH
                }   
                //maxH < 图片实际高度时走这里
                if(maxH < image.naturalHeight) {
                    needCompress = true;
                    ratio = image.naturalHeight / maxH;
                    maxW = image.naturalWidth / ratio;
                }
                if(!needCompress) {   //不需要压缩时,将图片宽高赋值给maxW和maxH
                    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.appendChild(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); //将图片输出
                const _image = new Image();
                _image.src= compressImage;
                document.body.appendChild(_image);
                const compressRatio = image.src.length / _image.src.length;
                exp.innerText = `压缩比为:${compressRatio}`
                callback && callback(compressImage);  //拿出压缩后的图片,进行上传等操作
                canvas.remove();
            })
            image.src= base64Image;
            image.src && document.body.append(image);
        }
        function uploadImage(file) {  //对压缩后的数据进行操作
            console.log(file);
        }
    </script>
</body>
</html>

七、互动时间

您是否遭遇过相似的图片上传困扰?您是如何应对的?敬请于评论区交流您的见解与策略,让我们共同拓宽前端开发的可能性。

在线随机小姐姐图片换一批
最新收录
  • 体育赛事分析报道

    让足球滚一会提供足球、篮球、NBA赛事前瞻分析推荐,与各联赛时实新闻报道、球员转会消息、赛事录像回放等资讯,用心认真把每件事做到最好的网站。

  • 足球比分直播

    体育即时比分网提供实时足球比分与篮球比分数据,包括即时比分、赛程、球队、竞猜等数据,让您无时无刻都能掌握时实足球比分与篮球比分动态消息。即时更新各项比赛数据与完赛结果。让足球滚一会带您体验精彩的竞猜足球比赛!

  • 金魔网

    金魔网

  • 外籍模特

    外籍模特

  • imtoken钱包

    :imtoken钱包为您提供最新的imtoken钱包信息,imtoken是全球最大的数字货币钱包,支持包括BTC, ETH, BSC, TRON, Aptos, Polygon, Solana, OKExChain, Polkadot, Kusama, EOS等在内的所有主流公链及Layer 2,已为全球近千万用户提供可信赖的数字货币资产管理服务,也是当前DeFi用户必备的工具钱包。

  • 明星经纪公司

    我们专注提供明星代言、商演、翻包视频、祝福视频录制等业务,十多年行业服务经验