首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js多图片压缩上传

在Web开发中,经常需要处理用户上传的图片,为了提高上传速度和节省服务器存储空间,通常会对图片进行压缩处理后再上传。以下是关于JavaScript多图片压缩上传的基础概念、优势、类型、应用场景以及解决方案:

基础概念

图片压缩是指通过减少图片文件的大小来降低存储需求和传输时间,同时尽量保持图片质量。JavaScript可以在客户端进行图片压缩,减少服务器负担。

优势

  1. 减少带宽消耗:压缩后的图片文件更小,上传和下载速度更快。
  2. 节省服务器存储空间:较小的文件占用的存储资源更少。
  3. 提升用户体验:更快的上传速度可以提升用户的满意度。

类型

  1. 有损压缩:通过牺牲一定的图片质量来减小文件大小,如JPEG格式。
  2. 无损压缩:在不损失图片质量的前提下减小文件大小,如PNG格式。

应用场景

  • 社交媒体平台
  • 电子商务网站
  • 在线教育平台
  • 企业内部管理系统

解决方案

以下是一个使用JavaScript进行多图片压缩上传的示例代码:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Multi Image Compression Upload</title>
</head>
<body>
    <input type="file" id="fileInput" multiple accept="image/*">
    <button onclick="uploadImages()">Upload Images</button>
    <script>
        async function compressImage(file) {
            const reader = new FileReader();
            reader.readAsDataURL(file);
            return new Promise((resolve, reject) => {
                reader.onload = event => {
                    const img = new Image();
                    img.src = event.target.result;
                    img.onload = () => {
                        const canvas = document.createElement('canvas');
                        const ctx = canvas.getContext('2d');
                        const maxWidth = 800; // 设置最大宽度
                        const scaleSize = maxWidth / img.width;
                        canvas.width = maxWidth;
                        canvas.height = img.height * scaleSize;
                        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
                        const compressedDataUrl = canvas.toDataURL('image/jpeg', 0.7); // 压缩质量设置为0.7
                        resolve(compressedDataUrl);
                    };
                    img.onerror = reject;
                };
                reader.onerror = reject;
            });
        }

        async function uploadImages() {
            const fileInput = document.getElementById('fileInput');
            const files = fileInput.files;
            const compressedImages = [];

            for (const file of files) {
                const compressedDataUrl = await compressImage(file);
                const byteString = atob(compressedDataUrl.split(',')[1]);
                const arrayBuffer = new ArrayBuffer(byteString.length);
                const intArray = new Uint8Array(arrayBuffer);
                for (let i = 0; i < byteString.length; i++) {
                    intArray[i] = byteString.charCodeAt(i);
                }
                const blob = new Blob([arrayBuffer], { type: 'image/jpeg' });
                compressedImages.push(blob);
            }

            // 这里可以进行上传操作,例如使用FormData上传到服务器
            const formData = new FormData();
            compressedImages.forEach((img, index) => {
                formData.append('images', img, `image${index}.jpg`);
            });

            fetch('/upload', {
                method: 'POST',
                body: formData
            }).then(response => response.json())
              .then(data => console.log(data))
              .catch(error => console.error(error));
        }
    </script>
</body>
</html>

解释

  1. 压缩图片:使用FileReader读取图片文件,然后使用canvas进行压缩。
  2. 转换格式:将压缩后的Data URL转换为Blob对象,便于上传。
  3. 上传图片:使用FormData将压缩后的图片上传到服务器。

注意事项

  • 压缩质量可以根据需求调整。
  • 压缩后的图片尺寸可以根据需求调整。
  • 上传过程中需要处理网络错误和服务器错误。

通过这种方式,可以在客户端对多张图片进行压缩,然后上传到服务器,从而提高上传效率和节省服务器资源。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JS 图片压缩

前言 说起图片压缩,大家想到的或者平时用到的很多工具都可以实现,例如,客户端类的有图片压缩工具 PPDuck3, JS 实现类的有插件 compression.js ,亦或是在线处理类的 OSS 上传,...文件上传后,在访问文件时中也有图片的压缩配置选项,不过,能不能自己撸一套 JS 实现的图片压缩代码呢?...压缩思路 涉及到 JS 的图片压缩,我的想法是需要用到 Canvas 的绘图能力,通过调整图片的分辨率或者绘图质量来达到图片压缩的效果,实现思路如下: 获取上传 Input 中的图片对象 File 将图片转换成...base64 格式 base64 编码的图片通过 Canvas 转换压缩,这里会用到的 Canvas 的 drawImage 以及 toDataURL 这两个 Api,一个调节图片的分辨率的,一个是调节图片压缩质量并且输出的...上传存储图片如果需要对文件大小格式有要求的,可以统一压缩处理图片 前台页面想要编辑图片,可以在 Canvas 处理图片的时候,加一些其他逻辑,例如添加文字,剪裁,拼图等等操作 当然温馨提示:因部分接口有

25.8K21
  • 前端图片压缩及上传

    图片的上传一般情况下不需要上传大体积的图片,因为如果是用户头像或者是一些要求清晰度不是太高的场景上传大体积图片会很消耗资源,一个是上传耗时比较长,同时也增加了存储的开销,当展示的时候也会消耗下载的带宽,...要求用户上传的图片之前压缩图片很影响用户体验,所以就增加了在前端进行图片压缩的需求。...压缩方案 前端图片压缩的主要思路就是将图片绘制到canvas中,然后通过canvas的toDataURL方法来控制图片的质量,对图片进行压缩,另一方面是对图片进行宽高等比缩小来达到图片压缩的效果,下面来看一下代码示例...调用方法时填入图片允许的最大宽度或者是最大的高度,进行等比绘制到canvas中,然后通过toDataURL来转换成base64格式返回,此时的图片就是压缩过后的图片。...当压缩完成后返回的数据就是base64的数据了,我们就可以通过ajax异步来进行上传,在此我采用的是axios进行异步上传,将内容及文件名作为参数传递给后台。

    2.9K20

    js拖拽上传图片

    有时候,在开发中,需要遇到拖拽上传图片的需求,即从磁盘选中一张或多张图片,然后按着鼠标把图片拖动到页面上指定的区域,实现图片的上传。...1、后端上传图片的接口 我是之前用vue写一个简单的后台系统的时候,用Java的SpringMVC+MyBatis的框架写了一个简单的后台管理的一些接口,刚好有一个上传用户头像的接口,该接口是把上传后的图片存储在另外一台...Tomcat下,这里就直接使用这个接口来上传图片。...if(res.success == 1){ // } // }, // }); // }); //多图上传...里面用的formData对象来上传图片的,该对象的作用是:   1、用一些键值对来模拟一系列表单控件,即把form中所有表单元素的name与value组装成一个queryString;   2、异步上传二进制文件

    18.2K30

    详解 JS 压缩图片

    作者 | wuwhs https://segmentfault.com/a/1190000023486410 公司的移动端业务需要在用户上传图片是由前端压缩图片大小,再上传到服务器,这样可以减少移动端上行流量...插播一下,本文案例已整理成插件,已上传 npm ,可通过 npm install js-image-compressor -D 安装使用,可以从 github 下载。...在熟悉以上各种图片转化方法的具体实现,将它们封装在一个公用对象 util 里,再结合压缩转化流程图,这里我们可以简单实现图片压缩了: 首先将上传图片转化成 Image 对象,再将写入到 Canvas...如果你有足够的耐心多传几种类型图片就会发现还存在如下问题: 压缩输出图片寸尺固定为原始图片尺寸大小,而实际可能需要控制输出图片尺寸,同时达到尺寸也被压缩目的; png 格式图片同格式压缩,压缩率不高,还有可能出现...将改进版图片压缩整理成插件,已上传 npm ,可通过 npm install js-image-compressor -D 安装使用,可以从 github 下载。 整理匆忙,如有问题欢迎大家指正,完~

    12.7K31

    微信小程序图片上传压缩

    在具体业务中,我们会遇到需要让用户上传本地图片的场景,随着现在的手机像素越来越高,图片的大小也越来越大,上传原图后一方面是难以上传成功,另一方面是上传成功后在列表中图片太大加载时间过长或者加载失败。...若是直接提示用户 “无法上传xxM以上的图片” ,用户体验会不好,于是需要我们对用户上传的图片进行压缩。本文主要记录了开发过程中探索压缩图片的过程和方式,以及一些踩坑记录。...-100})优势:不限图片宽高,任何图片都可以使用;劣势:只能压缩画质,不能压缩大小;ios和安卓压缩质量相同的情况下输出大小不一致,ios有自己的一套压缩机制,当压缩要极致质量大小以后,质量写再小都不会有变化...我们这次的需求主要是用户上传图片,然后在列表中展示,现在手机像素都挺好的,拍摄的图片都很大,并且也会有用户上传长截图,因此列表中的图片加载很慢,所以我综合了以上三种方式来实现压缩图片:判断系统为ios还是安卓...,由用户选择,一方面利用好自带的压缩功能,另一方面如果图片宽高大于40000,安卓压缩后会超级模糊,这时候用户预览后可以自己选择重新上传原图;选择图片以后,wx.chooseMedia返回的tempFiles

    9.8K52

    H5图片压缩与上传

    现在手机用户拍照照片都十分巨大,1m-10m,而普通用户的上传带宽大概为100kb/s-1m/s,导致上传图片十分缓慢 解决方法为上传之前先把图片进行压缩,使得上传速度增加,服务器硬盘,带宽速度压力也更小...var mpImg = new MegaPixImage(file);     // render方法的maxWith,maxHeight,以及quality都决定了压缩图片的质量     var resImg...压缩图片十分的耗时,尤其是多张图片一起的时候,所以需要稍微变换一下  fileSelected: function () {                    var files = $("#fileImage...,压缩成了297kb,花费了8秒左右的时间 因为图太大,就不上传了 本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn 上一篇:...shopnc自动结算的问题 下一篇: js格式化字符串自动补位

    2K11

    .Net之Layui多图片上传

    前言:   多图上传在一些特殊的需求中我们经常会遇到,其实多图上传的原理大家都有各自的见解。...对于Layui多图上传和我之前所说的通过js获取文本框中的文件数组遍历提交的原理一样,只不过是Layui中的upload.render方法已经帮我们封装好了,我们只管调用即可,也就是说你选中了几张图片,...Layui文件/图片样式地址(官方文档):https://www.layui.com/demo/upload.html 一、引入Layui.cs和Layui.js: 需要本地项目中存在layui相关样式和..." id="test2">滚动图片上传【推荐上传三张】 <button type="button" class="layui-btn layui-btn-danger" onclick...中的代码: layui.use('upload', function () { var $ = layui.jquery, upload = layui.upload; //多图片上传

    1.4K40
    领券