簡單交代配置阿里云OSS的思路
1. 首先去阿里云開通一個OSS服務,配置好一個自己的Bucket
2. 在IDEA配置Bucket
3. 拷貝官網的OSS工具類代碼
package com.sky.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;@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();}
}
4. OSS工具類對象的創建
package com.sky.config;import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置類,用于創建AliOssUtil對象*/
@Configuration
@Slf4j
public class OssConfiguration {// 通過參數注入的方式,將Oss的配置信息傳遞進來// Bean 如果容器中沒有AliOssUtil對象,則創建AliOssUtil對象// ConditionalOnBean 表示如果容器中存在AliOssUtil對象,則不創建AliOssUtil對象@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {log.info("開始創建阿里云文件上傳工具類對象:{}",aliOssProperties);// 創建AliOssUtil對象,并傳入配置信息return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}
5. 在Controller層編寫文件上傳邏輯
// Autowired注解的作用:自動將匹配的Bean裝配到@Autowired標注的變量、方法或構造函數上。(依賴注入)@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上傳* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上傳")public Result<String> upload(MultipartFile file) {log.info("文件上傳接口被調用:{}",file);String filePath = null;try {// 獲取原始文件名String originalFilename = file.getOriginalFilename();// 截取原始文件名的擴展名String extName = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成新的文件名: UUID + 擴展名String newFileName = UUID.randomUUID().toString() + extName;// 文件上傳請求路徑filePath = aliOssUtil.upload(file.getBytes(), newFileName);}catch(IOException e){e.printStackTrace();log.error("文件上傳失敗:{}",e);return Result.error(MessageConstant.UPLOAD_FAILED);}return Result.success(filePath);}
6. 測試(省略,做到這里基本無誤了)
接下來就來講講文件回顯失敗的幾點調試方向
文件回顯失敗的原因及其排查方向
1. 檢查你文件上傳拼接的url是否正確
這一步如果錯了,實際上上傳就已經錯了,更別提回顯這方面的事情了
2. 首先,如果你全程跟著蒼穹老師寫的代碼去做,必然會導致文件回顯失敗,我記得視頻里面的代碼最后是沒有返回文件上傳路徑的,你可以改一下再嘗試
具體的,蒼穹老師寫的文件上傳代碼:
問題就出在成功的時候還封裝了錯誤的信息進行返回,你應該要把錯誤的返回放到catch中,成功后把文件路徑放到Result中
/*** 文件上傳* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上傳")public Result<String> upload(MultipartFile file) {log.info("文件上傳接口被調用:{}",file);try {// 獲取原始文件名String originalFilename = file.getOriginalFilename();// 截取原始文件名的擴展名String extName = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成新的文件名: UUID + 擴展名String newFileName = UUID.randomUUID().toString() + extName;// 文件上傳請求路徑String filePath = aliOssUtil.upload(file.getBytes(), newFileName);}catch(IOException e){e.printStackTrace();log.error("文件上傳失敗:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
3. 接著排查OSS,你得允許你的網頁可以訪問你的OSS對象存儲服務之后才可以拿到文件的訪問路徑,使用OSS必須設置公共讀屬性
由于我只是練習程序,不想麻煩所以直接設置了公共讀寫。但是其實最安全的方式還是配置一個防盜鏈放行你的網頁會比較安全