在application.yml文件中引入對應的配置,一個是對應的節點,兩個是密鑰和賬號,還有一個是對應文件的名稱;
采用這樣方式進行解耦,便于后期修改。
然后需要設置一個properties類,去讀對應的配置信息
用到了ConfigurationProperties類,對應掃描的是alioss;
編寫對應的工具類
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上傳** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 創建OSSClient實例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 創建PutObject請求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}//文件訪問路徑規則 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上傳到:{}", stringBuilder.toString());return stringBuilder.toString();}
}
返回文件存儲的地址
在controller中編寫上傳方法;
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上傳* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上傳")public Result<String> upload(MultipartFile file){log.info("文件上傳:{}",file);try {//原始文件名String originalFilename = file.getOriginalFilename();//截取原始文件名的后綴 dfdfdf.pngString extension = originalFilename.substring(originalFilename.lastIndexOf("."));//構造新文件名稱String objectName = UUID.randomUUID().toString() + extension;//文件的請求路徑String filePath = aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error("文件上傳失敗:{}", e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
}
采用的UUID.randomUUID().toString() ,這個是隨機命名,可以防止上傳文件名稱出現重復。
還需要配置對應的Configuration類,初始化阿里云對象,把他交給bean進行管理
*/
@Configuration //配置類
@Slf4j
public class OssConfiguration {//配置類 用于初始化對象@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info("開始創建阿里云文件上傳工具類對象:{}",aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}
這邊是因為在Controller中使用了依賴注入,需要將對象交給bean進行管理,編寫對應的Configuration類;