项目场景:

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

公司需要使用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 "";
   }
}

Logo

亚马逊云科技开发者 Build On 是由亚马逊团队策划、开发者社区联合打造的动手实操系列活动。

更多推荐