图片上传/文件上传


前言

上传文件或者图片有很多种方式,今天为分享一下我所使用的

一、上菜

1.配置

image:
  path: D:\oss
  url: http://xxx.com/image

2.controller层

@RestController
@Api(value="文件上传", tags="文件上传")
@CrossOrigin(allowCredentials="true", maxAge= 86400)
public class UploadController {

    @Autowired
    private UploadService uploadService;

    @ApiOperation(httpMethod = "POST", value = "上传照片", notes = "上传照片", produces = MediaType.APPLICATION_JSON_VALUE)
    @PostMapping(value = "/upload")
    public BaseResult<UploadImageVo> uploadFileToImg(@RequestParam MultipartFile multfile) {
        // 上传照片
        return uploadService.getCompressPicture(multfile);
    }
}

3.service层

@Slf4j
@Service
public class UploadServiceImpl implements UploadService {

    /** 文件存储目录 */
    @NacosValue("${image.path}")
    private String PATH;
    /** 文件存储目录 */
    @NacosValue("${image.url}")
    private String URL;

    @Override
    public BaseResult getCompressPicture(MultipartFile multfile) {
        UploadImageVo vo = new UploadImageVo();
        if (Objects.isNull(multfile)) {
            return BaseResult.fail("上传文件为空");
        }

        try {
            // 图片名称
            String fileName = multfile.getOriginalFilename();
            // 文件后缀
            String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
            // 上传文件转换为Image
            Image originalImage = ImagesUtils.transformMultipartFileToImage(multfile);
            // 图片压缩
            BufferedImage image = ImagesUtils.compressImage(originalImage);
            if (Objects.isNull(image)) {
                return BaseResult.fail("上传文件解析错误,请查看上传文件是否正确");
            }
            // 图片名称
            String name = ImagesUtils.buildImageName(prefix);
            // 按日期增加目录 < 这里更具自己的需要使用 >
//            String dateTime = DateUtils.formatDateTimetoString(new Date(), DateUtils.FMT_yyyyMMdd);
            // 目录绝对路径
//            String direct = ImagesUtils.buildPath(PATH, dateTime);
            // 目录不存在则新建目录
            ImagesUtils.checkFildDirect(PATH);
            // 转存文件到指定目录
            String filePath = ImagesUtils.buildPath(PATH, name);
            File file = new File(filePath);
            ImageIO.write(image, prefix,file);

            String url = ImagesUtils.buildPath(URL, null);
            vo.setImagePath(filePath);
            vo.setImageName(name);
            vo.setImageUrl(String.format("%s/%s", url, name));
            return BaseResult.success(vo);
        } catch (Exception e) {
            log.error("上传图片文件失败", e);
            return BaseResult.fail("上传图片文件失败");
        }
    }
}

4.ImagesUtils工具🥱


@Slf4j
public class ImagesUtils {

    /**
     * 图片压缩
     * @param image
     * @return
     */
    public static BufferedImage compressImage(Image image) {
        if (Objects.isNull(image)) {
            return null;
        }
        // 根据原图片 获取原图片宽度、高度
        int originalWidth = image.getWidth(null);
        int originalHeight = image.getHeight(null);

        Double rate = 0.9;
        int width = (int) (originalWidth * rate);
        int height = (int) (originalHeight * rate);
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        bufferedImage.getGraphics().drawImage(image, 0, 0, width, height, null);
        return bufferedImage;
    }

    /**
     * MultipartFile 转 Image
     * @param multfile
     * @return
     */
    public static Image transformMultipartFileToImage(MultipartFile multfile){
        Image image = null;
        try {
            // 文件名
            String fileName = multfile.getOriginalFilename();
            // 文件后缀
            String prefix = fileName.substring(fileName.lastIndexOf("."));
            // 流转换
            File file = File.createTempFile(UUID.randomUUID().toString(), prefix);
            multfile.transferTo(file);
            image = ImageIO.read(file);
        } catch (IOException e) {
            log.error("文件转换流失败", e);
        }
        return image;
    }


    /**
     * 生成图片文件名
     * @param prefix
     * @return
     */
    public static String buildImageName(String prefix){
        String ran = String.format("%03d", new Random().nextInt(999));
        return String.format("IMG%s%s.%s", System.currentTimeMillis(), ran, prefix);
    }
    /**
     * 构建路径
     * @param path
     * @param param
     * @return
     */
    public static String buildPath(String path, String param){
        String direct = path.endsWith(File.separator) ? path.substring(0, path.length() - 1) : path;
        if (StringUtils.isBlank(param)) {
            return direct;
        } else {
            //   File.separator 根据操作系统 判断 / 和 \
            return  direct+File.separator+param;
        }
    }


    /**
     * 检验目录是否存在 不存在则创建
     * @param direct 目录绝对路径
     */
    public static void checkFildDirect(String direct){
        // 目录不存在则新建目录
        File dictFile = new File(direct);
        if (!dictFile.exists() || !dictFile.isDirectory()) {
            dictFile.mkdir();
        }
    }
}

总结

代码虽好,可不要贪杯哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值