上传图片及根据宽高等比例图片压缩

controller

    /**
     * 上传文件
     * @param file 【必填】 文件
     * @param path 【必填】 路径
     * @param name 文件名   不填默认为源文件名
     * @param type 【必填】 对象存储服务代码  1 阿里云OSS
     * @return
     */
    @PostMapping("upload")
    public ResultBody uploadFile(MultipartFile file, @RequestParam String path, String name, @RequestParam Integer type){

        if(ObjectUtil.isNull(file)){
            return ResultUtil.response(ResponseStatus.OSS_FILE_NOT_NULL);
        }

        String fileName = path;

        if(StringUtils.isNotBlank(name)){
            fileName = fileName + "/" + name;
        }else {
            fileName = fileName + "/" + file.getOriginalFilename();
        }

		// 提取扩展名
		String ext = "";
		if (fileName.lastIndexOf(".") > 0) {
			ext = fileName.substring(fileName.lastIndexOf(".") + 1);
		}
        
        String url = ossContextHolder.getOssService(OSSConstant.obtainName(type)).uploadFile(file, fileName, ext);

        return ResultUtil.success(url);
    }

service:

/**
     * 上传文件
     * @param file 文件
     * @param fileName 文件名
     * @param ext 文件名后缀
     * @return
     */
    @Override
    public String uploadFile(MultipartFile file, String fileName, String ext) {

        // 替换当前的文件名,避免文件被覆盖(2021-05-31)
        // 替换当前的文件名,避免文件被覆盖(2021-05-31)
        fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmSS")) + RandomUtil.randomNumbers(6);
        if (StrUtil.isNotBlank(ext)) {
            if (ext.startsWith(".")) {
                fileName = fileName + ext;
            } else {
                fileName = fileName + "." + ext;
            }
        }
        //基数 图片最大长度
        int  baseMax = 1024;
        try {
            System.out.println("原图片大小:" + file.getSize() / 1024 + "kb");
            InputStream inputStream = file.getInputStream();
            BufferedImage bufImg = ImageIO.read(inputStream);
            int srcWidth = bufImg.getWidth();
            int srcHeight = bufImg.getHeight();

            // 指定大小(宽或高超出会才会被缩放)
            ByteArrayInputStream byteArrayInputStream = null;
            if (srcWidth > baseMax || srcHeight > baseMax) {
                //计算缩放比
                Boolean flag = srcWidth > srcHeight ? true :false;
                BigDecimal ratio = new BigDecimal(0.8);
                if(flag){
                    ratio = new BigDecimal(baseMax).divide(new BigDecimal(srcWidth), 6, BigDecimal.ROUND_HALF_UP);
                }else{
                    ratio = new BigDecimal(baseMax).divide(new BigDecimal(srcHeight), 6, BigDecimal.ROUND_HALF_UP);
                }
                BigDecimal a = new BigDecimal(srcWidth).multiply(ratio);
                BigDecimal b = new BigDecimal(srcHeight).multiply(ratio);
                int desMaxWidth = a.intValue();
                int desMaxHeight = b.intValue();

                byte[] bytes = compressPictureForScale(file.getBytes(), desMaxWidth, desMaxHeight);
                byteArrayInputStream = new ByteArrayInputStream(bytes);
                return aliOssUploadUtil.uploadFile(byteArrayInputStream, fileName, ext);
            }else{
                return aliOssUploadUtil.uploadFile(file, fileName, ext);
            }
        } catch (Exception e) {
            System.out.println("图片上传失败,重新上传!");
            return aliOssUploadUtil.uploadFile(file, fileName, ext);
        }

    }
    //压缩图片到指定大小
    private byte[] compressPictureForScale(byte[] imageBytes,int width,int hight) throws IOException {

        if (imageBytes == null || imageBytes.length <= 0) {
            return imageBytes;
        }
        ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
        Thumbnails.of(inputStream).size(width,hight).keepAspectRatio(false).toOutputStream(outputStream);
        imageBytes = outputStream.toByteArray();
        return imageBytes;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值