SpringBoot整合AWS OSS 文件上傳

Amazon S3 Glacier文件上傳
官方文檔:
https://docs.aws.amazon.com/zh_cn/amazonglacier/latest/dev/introduction.html
https://docs.aws.amazon.com/zh_cn/sdk-for-java/v2/developer-guide/setup-install.html

1.下載demo
(本文中的上傳類並未使用demo中的代碼,demo僅供參考)

https://github.com/awslabs/aws-java-sample.git
打開demo查看README.txt
在這裏插入圖片描述這裏說明一下,這是aws oss 上傳文件的安全憑證,可在aws控制檯獲取參數值,創建的目錄爲:

~/.aws/credentials on Linux, macOS, or Unix
C:\Users\USERNAME.aws\credentials on Windows

具體可參考:https://blog.csdn.net/weixin_30733003/article/details/95404897
注意,linux下 .aws 是隱藏文件,使用ls -a可查看包括隱藏文件在內的所有文件

2.引入依賴

<dependency>
   <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.9.6</version>
</dependency>

3.上傳類代碼如下

需要準備的還有bucketName和Regions,均可在AWS控制檯獲取

/**
 * 圖片處理
 * @author sxd
 * @date 2020/6/17 10:50
 */
@Controller
@RequestMapping("/picture")
public class PictureController {

    private static final Logger log = LoggerFactory.getLogger(CommonController.class);

    public static String bucketName = "beta-china-game";

    public static AmazonGlacierClient client;

    /**
     * AWS OSS 圖片上傳
     * */
    @PostMapping("/awsUpload")
    @ResponseBody
    public AjaxResult awsUpload(@RequestParam("filePic") MultipartFile filePic) {
        try
        {
            // 上傳並返回新文件名稱
            log.info("開始上傳文件");

            File fileFile = multipartFileToFile(filePic);
            //獲取文件名
            String remoteFileName = "game-pic-" + fileFile.getName();
            // 開始上傳
            String pictureAwsUrl = upload(fileFile, remoteFileName);
            //上傳成功
            if (pictureAwsUrl != null) {
                // AWS默認文件鏈接有效期爲15分鐘,爲保證鏈接長期有效,只保留?前面的部分
                String pictureAwsUrlDeal = pictureAwsUrl.substring(0, pictureAwsUrl.indexOf("?"));
                AjaxResult ajax = AjaxResult.success();
                ajax.put("fileName", fileFile.getName());
                ajax.put("url", pictureAwsUrlDeal);
                return ajax;
            } else {
                return AjaxResult.error("上傳失敗!請稍後重試!");
            }
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

    public String upload(File pic, String remoteFileName) throws IOException {
        try {
            AmazonS3 s3 = new AmazonS3Client();
            Region usWest2 = Region.getRegion(Regions.AP_NORTHEAST_1);
            s3.setRegion(usWest2);

            s3.putObject(new PutObjectRequest(bucketName, remoteFileName, pic)
                    .withCannedAcl(CannedAccessControlList.PublicRead));
            GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, remoteFileName);
            URL url = s3.generatePresignedUrl(urlRequest);
            return url.toString();
        } catch (AmazonServiceException ase) {
            ase.printStackTrace();
        } catch (AmazonClientException ace) {
            ace.printStackTrace();
        }
        return null;
    }

	/**
     * MultipartFile文件類型轉化爲File類型
     * */
    public static File multipartFileToFile(MultipartFile multiFile) {
        // 獲取文件名
        String fileName = multiFile.getOriginalFilename();
        // 獲取文件後綴
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        // 若需要防止生成的臨時文件重複,可以在文件名後添加隨機碼

        try {
            File file = File.createTempFile(fileName, prefix);
            multiFile.transferTo(file);
            return file;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章