aws上传图片

项目场景:

提示:这里简述项目相关背景:

公司需要使用aws上传图片,但是不能使用aksk,并且图片没有直接访问权限,找了许久没有相关的笔记,所以记录一下

问题描述

不能使用aksk,并且图片没有直接访问权限

public class AwsConfig {
    @Value("${aws.accessKey}")
    private String accessKey;

    @Value("${aws.secretKey}")
    private String secretKey;

    @Value("${aws.region}")
    private String region;

	//桶名
    @Value("${aws.bucketName}")
    private String bucketName;
    
    @Bean
    public AmazonS3 getAmazonS3() {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);

        AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                //设置服务器所属地区
                .withRegion(Regions.AP_SOUTHEAST_1)
                .build();
        return s3;
    }

}

解决方案:

现在使用AmazonS3ClientBuilder来创建AmazonS3,并且将图片下载就能访问图片了

@Bean
public AmazonS3 getS3Client(){
    return  AmazonS3ClientBuilder.standard().withRegion(Regions.CN_NORTH_1).build();
}

//上传图片的接口
@Override
public ActionResult upload(MultipartFile multipartFile) throws IOException {
    TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3.getS3Client()).build();
    String originalFileName = multipartFile.getOriginalFilename();
    assert originalFileName != null;
    String key = UUID.randomUUID() + originalFileName.substring(originalFileName.lastIndexOf("."));
    ObjectMetadata objectMetadata = new ObjectMetadata();
    objectMetadata.setContentType(multipartFile.getContentType());
    objectMetadata.setContentLength(multipartFile.getSize());
    transferManager.upload(new PutObjectRequest(bucketName, "acafevideo/" + key, multipartFile.getInputStream(), objectMetadata));
    //创建一个虚拟路由,用于没有权限访问图片
    return ActionResult.ok(baseUrl + contextPath + "/image/" + key);
}

//访问图片
@GetMapping(value = "/{imgName}")
public void getImgUrl(@PathVariable(name = "imgName") String imgName, HttpServletResponse response) {
   try {
       byte[] bytes = fileUploadService.getImgUrl(imgName);
       response.setContentType(MediaType.IMAGE_JPEG_VALUE);
       String extensionName = getFileExtension(imgName);
       switch (extensionName) {
           case "gif":
               response.setContentType(MediaType.IMAGE_GIF_VALUE);
               break;
           case "png":
               response.setContentType(MediaType.IMAGE_PNG_VALUE);
               break;
       }
       ServletOutputStream outputStream = response.getOutputStream();
       outputStream.write(bytes);
       outputStream.flush();
       outputStream.close();
   } catch (Exception e) {
       e.printStackTrace();
   }
}

private String getFileExtension(String fileName) {
   if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {
       return fileName.substring(fileName.lastIndexOf(".") + 1);
   } else {
       return "";
   }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值