图片上传功能实现

上传到云存储

概述

通过UploadManager上传
服务层实现类中我们接收到传入的图片对象,获取文件名称,后判断图片名称后缀(png/)是否符合要求,然后获取当前日期时间,以日期路径+uuid随机生成的不重复文件名 + 后缀 的形式拼接成文件名,然后new一个带指定Region的Configuration配置类对象,通过该配置类对象指定图片上传的API版本(V1或V2),以此new一个UploadManager对象,将云存储器的accessKey、secretKey、bucket通过封装成Auth对象,通过UploadManager对象put 图片文件stream流、新图片文件名、Auth对象以实现文件上传到云存储器。

大概步骤

上传到云存储器:
1.获取图片文件名,判断图片类型
2.通过当前时间+UUID+原后缀 生成新文件名字符串
3.指定图片分片上传API版本,构建一个UploadManager对象
4.转换原图片为stream流
5.封装accessKey、secretKey、bucket为Auth对象
6.通过UploadManager对象put图片流、新图片名、Auth对象实现上传并返回外链
7.最后将路径存入数据库

详细步骤

1.获取图片文件名,判断图片类型

@Service
public class OssUploadServiceImpl implements UploadService {
    @Override
    public ResponseResult uploadImg(MultipartFile img) {
        //1.获取文件名
        String originalFilename = img.getOriginalFilename();

        //判断类型
        if(!originalFilename.endsWith(".png")){
            throw new SystemException(AppHttpCodeEnum.FILE_TYPE_ERROR);
        }

2.通过当前时间+UUID+原后缀 生成新文件名字符串

public static String generateFilePath(String fileName){
        //根据日期生成路径   2022/1/15/
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
        String datePath = sdf.format(new Date());
        
        //随机生成uuid作为文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        //后缀和文件后缀一致
        int index = fileName.lastIndexOf(".");
        // test.jpg -> .jpg
        String fileType = fileName.substring(index);

        //以日期路径+uuid+后最的形式拼接成文件名返回
        return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();
    }

3.指定图片分片上传API版本,构建一个UploadManager对象

//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);

4.转换原图片为stream流

InputStream inputStream = imgFile.getInputStream();

5.封装accessKey、secretKey、bucket为Auth对象

private String accessKey;     //启动时从yml配置文件中获得
private String secretKey;    //云服务密钥
private String bucket;
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);

6.通过UploadManager对象put图片流、新图片名、Auth对象返回外链
上传到服务器本地

Response response = uploadManager.put(inputStream, key, upToken, null, null);
//解析上传成功的结果
 DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

上传到服务器本地存储

概述

服务层实现类中我们接收到传入的图片对象,获取文件名称,后判断图片名称后缀(png/)是否符合要求,然后获取当前日期时间,以日期路径+uuid随机生成的不重复文件名 + 后缀 的形式拼接成文件名, 通过multipartFile.transferTo(“存储目录文件名”)存储到服务器本地并返回存储路径。

大概步骤

上传到云存储器:
1.获取图片文件名,判断图片类型
2.通过当前时间+UUID+原后缀 生成新文件名字符串
3.通过MultipartFile图片自带的transferTo(“新存储目录+文件名”)方法实现存储并返回存储路径
4.最后将路径存入数据库

详细步骤

@Override
    public Object uploadImages(MultipartFile multipartFile) {
        System.out.println("图片:==="+multipartFile);
        // 1、获取真实文件名
        String originalFilename = multipartFile.getOriginalFilename();
        // 判断后缀,截取图片的后缀 lastIndexOf最后出现.的位置
        String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 2、生成唯一文件名
        String newFileName = UUID.randomUUID().toString()+imgSuffix;
        System.out.println("新文件名==="+newFileName);
        // 日期目录
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy\\MM\\dd");
        String dataPath = dateFormat.format(new Date());
        //
        File targetPath = new File(uploadPath, dataPath); // 拼接成新目录
        System.out.println("上传目录==="+targetPath);
        // mkdirs:不存在则创建,mkdir:不存在则返回false
        if(!targetPath.exists()) targetPath.mkdirs(); // 如果目录不存在,则递归创建
        //指定文件上传后的服务器完整路径[包括文件名]
        File TargetFileName = new File(targetPath, newFileName);
        System.out.println("完整路径:==="+TargetFileName);
        // 3、文件上传到指定目录
        try {
            multipartFile.transferTo(TargetFileName); // 文件上传到指定目录
            System.out.println("文件上传到目录==="+TargetFileName); // D:\2021\12\05\68f61bc7-07b9-41c6-876b-22c9a57f5606.png
            String finalFileName = dataPath + "\\" + newFileName;
            System.out.println("返回路径==="+visitPath+"\\"+finalFileName);
            //4.将存储路径存入数据库
            Long userId = SecurityUtils.getUserId();
            User user = userService.getById(userId);
            user.setAvatar(finalFileName);
            userService.updateById(user);

            return visitPath+"\\"+finalFileName; // 返回可访问的地址
        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }
    }
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值