前端如何压缩图片在进行上传给后端

   前端压缩图片我目前能想到的就是 通过canvas 改变图片的 画质去改变图片的大小。

解决方案如下:
1、首先获取图片的全部内容,然后转化为base64让他可以在页面上展示。
2、当我们获取到base64的图片的时候我们就可以获取图片的大小尺寸。
3、我们把这个图片放置到canvas上面去,然后通过cavans属性drawImg重新获取图片。
4、将重新获取的图片转化为url。

注意注意:当前只支持jpg图片的压缩,因为手机拍出来的图片是jpg图片。这是我的场景需要,如果你是png不建议你用,或者你有更好的方案可以也给我说说~~~

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="btn">上传</div>
</body>

</html>
<script>

    let btn = document.querySelector('.btn');
    class CompressImg {
        fileReader = new FileReader();
        constructor(options) {
            this.options = options;
            this.createBase64();
        }
        createBase64() {
            // console.log(fileRender)
            this.fileReader.onload = (e) => {
                console.log(e.target?.result, '---')
                this.compress(e.target?.result)
            }
            this.fileReader.readAsDataURL(this.options.file);
        }
        compress(url) {
            const img = new Image();
            img.src = url;
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');
            ctx.height = img.height;
            ctx.width = img.width;
            img.onload = () => {
                ctx.drawImage(img, 0, 0, img.width, img.height);
                const base = canvas.toDataURL(this.options.file.type, this.options.quality);
                this.options.success(base);

            }
        }
    }

    btn.addEventListener('click', () => {
        showOpenFilePicker().then(async (file) => {
            const files = await file[0].getFile();
            if (files) {
                new CompressImg({
                    file: files,
                    quality: 1,
                    success: (url) => {
                        console.log(url)
                    }
                })
            }
        })
    })
</script>

效果:
在这里插入图片描述

要将前端上传的图片存储到 OSS 上,需要进行以下步骤: 1. 前端上传图片。可以使用 HTML5 的 FormData API 或者第三方库,如 axios、jquery 等来实现图片上传功能。 2. 后端接收图片并上传到 OSS。可以使用阿里云 OSS 的 Java SDK,将图片上传到 OSS。 以下是一个简单的示例代码: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; public class OSSUtil { private static final String ENDPOINT = "oss-cn-hangzhou.aliyuncs.com"; private static final String ACCESS_KEY_ID = "***"; private static final String ACCESS_KEY_SECRET = "***"; private static final String BUCKET_NAME = "***"; /** * 上传文件到 OSS * * @param file 文件对象 * @return 文件访问路径 */ public static String upload(MultipartFile file) throws IOException { // 创建 OSS 客户端实例 OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); // 获取文件名 String originalFilename = file.getOriginalFilename(); // 生成文件名,避免重名 String fileName = UUID.randomUUID().toString().replaceAll("-", "") + originalFilename.substring(originalFilename.lastIndexOf(".")); // 获取文件输入流 InputStream inputStream = file.getInputStream(); // 上传文件到 OSS ossClient.putObject(BUCKET_NAME, fileName, inputStream); // 关闭 OSS 客户端 ossClient.shutdown(); // 返回文件访问路径 return "https://" + BUCKET_NAME + "." + ENDPOINT + "/" + fileName; } } ``` 在上面的代码中,我们使用了阿里云 OSS 的 Java SDK,通过构建 OSS 客户端实例,实现了将文件上传到 OSS 的功能。其中,我们需要替换代码中的 ENDPOINT、ACCESS_KEY_ID、ACCESS_KEY_SECRET 和 BUCKET_NAME 参数为自己阿里云账号的相关信息。 3. 返回图片访问路径。上传成功后,需要将图片在 OSS 上的访问路径返回给前端,以便前端可以通过该路径访问图片。 以上就是将前端上传的图片存储到 OSS 的整个流程。需要注意的是,建议在后端上传图片时,对图片进行压缩和校验,以提高上传效率和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值