菜鸟踩坑之SpringBoot将Base64格式的图片上传到阿里云OSS

菜鸟踩坑之SpringBoot将Base64格式的图片上传到阿里云OSS

前提提要:之前又发布将文件上传到OSS阿里云。今天前端同事说,前端的图片可能会经过裁剪传递到后端,他会传递过来Base64格式的图片,意味着,我这边后端的接口也要发生变化。
于是,有了今天的踩坑。
依赖:

        <!-- 阿里云 对象存储oss -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.0<</version>
        </dependency>

yml文件:

aliyun:
  oss:
    endpoint: oss-cn-hangzhou.aliyuncs.com # oss对外服务的访问域名
    accessKeyId: xxx # 访问身份验证中用到用户标识
    accessKeySecret: xxx# 用户用于加密签名字符串和oss用来验证签名字符串的密钥
    bucketName: zhuicat-dev # oss的存储空间

Controller层:

    @PostMapping("uploadOneFile")
    @ApiOperation("修改个人头像")
    public CommonResult uploadFile(@RequestBody String file) throws IOException {
        //返回上传oss的url
        String uploadOneFile = ossUtils.uploadOneFile(file);
        // 获取当前登录用户信息
        Long userId = SecurityUtils.getUserId();
        SysUser sysUser = new SysUser();
        sysUser.setId(userId);
        sysUser.setAvatar(uploadOneFile);
        // 更新数据库信息
        sysUserService.updateById(sysUser);
      
    }

OssUtils

@Component
public class OssUtils {

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    private String secretAccessKey;

    @Value("${aliyun.oss.endpoint}")
    private String endPoint;

    @Value("${aliyun.oss.bucketName}")
    private String bucketName;

    public String uploadOneFile(String file) throws IOException {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);

        // 设置文件名
        String fileName = new DateTime().toString("yyyy/MM/dd")
                + UUID.randomUUID().toString().replace("-", "");

        // 获取文件后缀名
        int originalFilenameStartIndex = file.indexOf('/');
        int originalFilenameEndIndex = file.indexOf(';');
        String originalFilename = file.substring(originalFilenameStartIndex+1,originalFilenameEndIndex);
        if (SystemConstants.Picture_Format_JPEG.equals(originalFilename)) {
            fileName += ".jpg";
        }else if (SystemConstants.Picture_Format_PGN.equals(originalFilename)) {
            fileName += ".png";
        }else {
            throw new ApiException(ErrorEnum.REQUEST_FILE_TYPE_ERROR);
        }
        // 获取base64的文件
        file = file.split(",")[1];

        byte[] bytesFile = Base64.decode(file);
        try {
            // 创建PutObject请求。
            InputStream inputStream = new ByteArrayInputStream(bytesFile);
            ossClient.putObject(bucketName, fileName, inputStream);

            String url = "http://" + bucketName + "." + endPoint + "/" + fileName;
            // System.out.println(url);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

}

常量类:

public class SystemConstants {
    public static final String Picture_Format_PGN = "png";
    public static final String Picture_Format_JPEG = "jpeg";
}

测试:
Base64在线网站:Base64在线工具
在这里插入图片描述
将生成的东西复制,测试:
在这里插入图片描述浏览器上输入data里面的内容,看到图片
在这里插入图片描述
成功!!!!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图片上传阿里云OSS并存入MySQL可以分为以下几个步骤: 1. 添加阿里云OSS依赖 ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` 2. 配置阿里云OSS参数 ```java @Configuration public class OSSConfig { @Value("${spring.aliyun.oss.access-key-id}") private String accessKeyId; @Value("${spring.aliyun.oss.access-key-secret}") private String accessKeySecret; @Value("${spring.aliyun.oss.endpoint}") private String endpoint; @Value("${spring.aliyun.oss.bucket-name}") private String bucketName; @Bean public OSSClient ossClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } @Bean public OSSProperties ossProperties() { return new OSSProperties(accessKeyId, accessKeySecret, endpoint, bucketName); } } ``` 3. 编写上传图片的服务类 ```java @Service public class ImageService { private final OSSClient ossClient; private final OSSProperties ossProperties; @Autowired public ImageService(OSSClient ossClient, OSSProperties ossProperties) { this.ossClient = ossClient; this.ossProperties = ossProperties; } public String uploadImage(MultipartFile file) throws Exception { String filename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); String key = UUID.randomUUID().toString() + "-" + filename; ossClient.putObject(ossProperties.getBucketName(), key, inputStream); return key; } } ``` 4. 将上传的图片信息存入MySQL ```java @Service public class ImageInfoService { private final ImageInfoRepository imageInfoRepository; @Autowired public ImageInfoService(ImageInfoRepository imageInfoRepository) { this.imageInfoRepository = imageInfoRepository; } public void saveImageInfo(String filename, String key) { ImageInfo imageInfo = new ImageInfo(); imageInfo.setFilename(filename); imageInfo.setKey(key); imageInfoRepository.save(imageInfo); } } ``` 5. 控制器中调用上传图片的服务类和存入MySQL的服务类 ```java @RestController @RequestMapping("/image") public class ImageController { private final ImageService imageService; private final ImageInfoService imageInfoService; @Autowired public ImageController(ImageService imageService, ImageInfoService imageInfoService) { this.imageService = imageService; this.imageInfoService = imageInfoService; } @PostMapping("/upload") public Result uploadImage(@RequestParam("file") MultipartFile file) { try { String key = imageService.uploadImage(file); imageInfoService.saveImageInfo(file.getOriginalFilename(), key); return Result.success("上传成功"); } catch (Exception e) { e.printStackTrace(); return Result.error("上传失败"); } } } ``` 以上就是将图片上传阿里云OSS并存入MySQL的实现过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值