中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能

發布時間:2020-11-03 15:37:18 來源:億速云 閱讀:2838 作者:Leah 欄目:開發技術

這篇文章運用簡單易懂的例子給大家介紹使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創建一個spring boot項目,pom文件需要引入依賴:

pom.xml

<dependencies>
 <!--
 個人版本踩坑:
 不加這個依賴的話,當在配置類中
 使用@ConfigurationProperties(prefix = "aliyun")注解時,
 我這個版本的spring boot會提示有問題
 -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
 <optional>true</optional>
 </dependency>
 <!-- swagger2 -->
 <dependency>
 <groupId>io.springfox</groupId>
 <artifactId>springfox-swagger2</artifactId>
 <version>2.9.2</version>
 </dependency>
 <!-- swagger ui -->
 <dependency>
 <groupId>io.springfox</groupId>
 <artifactId>springfox-swagger-ui</artifactId>
 <version>2.9.2</version>
 </dependency>
 <!-- thymeleaf 可不加,個人習慣性引入 -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>
 <!-- web -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!-- 熱部署,看個人習慣 -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
 <scope>runtime</scope>
 <optional>true</optional>
 </dependency>
 
 <!-- 小辣椒插件,推薦使用,可以節省javaBean的setter/getter,還可以使用鏈式調用 -->
 <dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <optional>true</optional>
 </dependency>
 <!-- fastJson -->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>1.2.62</version>
 </dependency>
 <!-- aliyun-oos -->
 <dependency>
 <groupId>com.aliyun.oss</groupId>
 <artifactId>aliyun-sdk-oss</artifactId>
 <version>2.8.3</version>
 </dependency>
 <dependency>
 <groupId>joda-time</groupId>
 <artifactId>joda-time</artifactId>
 <version>2.10.1</version>
 </dependency>
 <!-- apache-common-lang3 -->
 <dependency>
 <groupId>org.apache.commons</groupId>
 <artifactId>commons-lang3</artifactId>
 <version>3.8.1</version>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 <exclusions>
 <exclusion>
 <groupId>org.junit.vintage</groupId>
 <artifactId>junit-vintage-engine</artifactId>
 </exclusion>
 </exclusions>
 </dependency>
</dependencies>

包結構很簡單:

使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能

我們使用自己添加的application-aliyun-oss.properties配置文件,去配置OSS相關信息,之所以不在application.yml 中配置,看個人習慣了,因為自定義的配置屬性還是提出來配比較好,沒必要所有的都配到application.yml(properties)中去。

application-aliyun-oss.properties

# 文件上傳大小限制
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB

# 地域節點
aliyun.endPoint=oss-cn-beijing.aliyuncs.com
# Bucket 域名
aliyun.urlPrefix=http://csp-xxxx.oss-cn-beijing.aliyuncs.com/
# accessKey Id
aliyun.accessKeyId=LTAI4XXXXXXXzqD1saGFZ
# accessKey Secret
aliyun.accessKeySecret=2WjxNXXXXXXXX4f2bREc
# 你的Bucket名稱
aliyun.bucketName=csp-xxxx
# 目標文件夾
aliyun.fileHost=files

config包下的相關配置類

AliyunOssConfig.java

/**
 * @Auther: csp1999
 * @Date: 2020/10/31/13:33
 * @Description: 阿里云 OSS 基本配置
 */
// 聲明配置類,放入Spring容器
@Configuration
// 指定配置文件位置
@PropertySource(value = {"classpath:application-aliyun-oss.properties"})
// 指定配置文件中自定義屬性前綴
@ConfigurationProperties(prefix = "aliyun")
@Data// lombok
@Accessors(chain = true)// 開啟鏈式調用
public class AliyunOssConfig {
 private String endPoint;// 地域節點
 private String accessKeyId;
 private String accessKeySecret;
 private String bucketName;// OSS的Bucket名稱
 private String urlPrefix;// Bucket 域名
 private String fileHost;// 目標文件夾

 // 將OSS 客戶端交給Spring容器托管
 @Bean
 public OSS OSSClient() {
 return new OSSClient(endPoint, accessKeyId, accessKeySecret);
 }
}

Swagger2Config.java

/**
 * @Auther: csp1999
 * @Date: 2020/10/31/16:30
 * @Description: Swagger 配置類
 */
@Configuration
@EnableSwagger2// 開啟swagger2
public class Swagger2Config {

 @Bean
 public Docket webApiConfig() {

 return new Docket(DocumentationType.SWAGGER_2)
 .groupName("webApi")
 .apiInfo(webApiInfo())
 .select()
 .paths(Predicates.not(PathSelectors.regex("/error.*")))
 .build();
 }

 private ApiInfo webApiInfo() {
 return new ApiInfoBuilder()
 .title("SpringBoot整合OSS-API文檔")
 .description("阿里云OSS-文件上傳下載測試")
 .version("1.0")
 .contact(new Contact("CSP", "https://blog.csdn.net/weixin_43591980", ""))
 .build();
 }
}

定義一個關于執行狀態結果的枚舉類

/**
 * @Auther: csp1999
 * @Date: 2020/10/31/17:03
 * @Description: 狀態碼枚舉類
 */
public enum StatusCode {
 SUCCESS("success",200),ERROR("error",500);
 private String msg;
 private Integer code;

 StatusCode(String msg,Integer code){
 this.msg = msg;
 this.code = code;
 }
 StatusCode(Integer code){
 this.code = code;
 }
 StatusCode(String msg){
 this.msg = msg;
 }
 public String getMsg() {
 return msg;
 }
 public void setMsg(String msg) {
 this.msg = msg;
 }
 public Integer getCode() {
 return code;
 }
 public void setCode(Integer code) {
 this.code = code;
 }
}

service層

在service使用ossClient操作阿里云OSS,進行上傳、下載、刪除、查看所有文件等操作,同時可以將圖片的url進行入庫操作:

FileUploadService.java

/**
 * @Auther: csp1999
 * @Date: 2020/10/31/14:30
 * @Description: 文件上傳Service (為節省文章中的代碼篇幅,不再做接口實現類處理)
 */
@Service("fileUploadService")
public class FileUploadService {
 // 允許上傳文件(圖片)的格式
 private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
 ".jpeg", ".gif", ".png"};
 @Autowired
 private OSS ossClient;// 注入阿里云oss文件服務器客戶端
 @Autowired
 private AliyunOssConfig aliyunOssConfig;// 注入阿里云OSS基本配置類

 /*
 * 文件上傳
 * 注:阿里云OSS文件上傳官方文檔鏈接:https://help.aliyun.com/document_detail/84781.html&#63;spm=a2c4g.11186623.6.749.11987a7dRYVSzn
 * @param: uploadFile
 * @return: string
 * @create: 2020/10/31 14:36
 * @author: csp1999
 */
 public String upload(MultipartFile uploadFile) {
 // 獲取oss的Bucket名稱
 String bucketName = aliyunOssConfig.getBucketName();
 // 獲取oss的地域節點
 String endpoint = aliyunOssConfig.getEndPoint();
 // 獲取oss的AccessKeySecret
 String accessKeySecret = aliyunOssConfig.getAccessKeySecret();
 // 獲取oss的AccessKeyId
 String accessKeyId = aliyunOssConfig.getAccessKeyId();
 // 獲取oss目標文件夾
 String filehost = aliyunOssConfig.getFileHost();
 // 返回圖片上傳后返回的url
 String returnImgeUrl = "";

 // 校驗圖片格式
 boolean isLegal = false;
 for (String type : IMAGE_TYPE) {
 if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
 isLegal = true;
 break;
 }
 }
 if (!isLegal) {// 如果圖片格式不合法
 return StatusCode.ERROR.getMsg();
 }
 // 獲取文件原名稱
 String originalFilename = uploadFile.getOriginalFilename();
 // 獲取文件類型
 String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
 // 新文件名稱
 String newFileName = UUID.randomUUID().toString() + fileType;
 // 構建日期路徑, 例如:OSS目標文件夾/2020/10/31/文件名
 String filePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
 // 文件上傳的路徑地址
 String uploadImgeUrl = filehost + "/" + filePath + "/" + newFileName;

 // 獲取文件輸入流
 InputStream inputStream = null;
 try {
 inputStream = uploadFile.getInputStream();
 } catch (IOException e) {
 e.printStackTrace();
 }
 /**
 * 下面兩行代碼是重點坑:
 * 現在阿里云OSS 默認圖片上傳ContentType是image/jpeg
 * 也就是說,獲取圖片鏈接后,圖片是下載鏈接,而并非在線瀏覽鏈接,
 * 因此,這里在上傳的時候要解決ContentType的問題,將其改為image/jpg
 */
 ObjectMetadata meta = new ObjectMetadata();
 meta.setContentType("image/jpg");

 //文件上傳至阿里云OSS
 ossClient.putObject(bucketName, uploadImgeUrl, inputStream, meta);
 /**
 * 注意:在實際項目中,文件上傳成功后,數據庫中存儲文件地址
 */
 // 獲取文件上傳后的圖片返回地址
 returnImgeUrl = "http://" + bucketName + "." + endpoint + "/" + uploadImgeUrl;

 return returnImgeUrl;
 }

 /*
 * 文件下載
 * @param: fileName
 * @param: outputStream
 * @return: void
 * @create: 2020/10/31 16:19
 * @author: csp1999
 */
 public String download(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
// // 設置響應頭為下載
// response.setContentType("application/x-download");
// // 設置下載的文件名
// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
// response.setCharacterEncoding("UTF-8");
 // 文件名以附件的形式下載
 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));

 // 獲取oss的Bucket名稱
 String bucketName = aliyunOssConfig.getBucketName();
 // 獲取oss目標文件夾
 String filehost = aliyunOssConfig.getFileHost();
 // 日期目錄
 // 注意,這里雖然寫成這種固定獲取日期目錄的形式,邏輯上確實存在問題,但是實際上,filePath的日期目錄應該是從數據庫查詢的
 String filePath = new DateTime().toString("yyyy/MM/dd");

 String fileKey = filehost + "/" + filePath + "/" + fileName;
 // ossObject包含文件所在的存儲空間名稱、文件名稱、文件元信息以及一個輸入流。
 OSSObject ossObject = ossClient.getObject(bucketName, fileKey);
 try {
 // 讀取文件內容。
 InputStream inputStream = ossObject.getObjectContent();
 BufferedInputStream in = new BufferedInputStream(inputStream);// 把輸入流放入緩存流
 ServletOutputStream outputStream = response.getOutputStream();
 BufferedOutputStream out = new BufferedOutputStream(outputStream);// 把輸出流放入緩存流
 byte[] buffer = new byte[1024];
 int len = 0;
 while ((len = in.read(buffer)) != -1) {
 out.write(buffer, 0, len);
 }
 if (out != null) {
 out.flush();
 out.close();
 }
 if (in != null) {
 in.close();
 }
 return StatusCode.SUCCESS.getMsg();
 } catch (Exception e) {
 return StatusCode.ERROR.getMsg();
 }
 }

 /*
 * 文件刪除
 * @param: objectName
 * @return: java.lang.String
 * @create: 2020/10/31 16:50
 * @author: csp1999
 */
 public String delete(String fileName) {
 // 獲取oss的Bucket名稱
 String bucketName = aliyunOssConfig.getBucketName();
 // 獲取oss的地域節點
 String endpoint = aliyunOssConfig.getEndPoint();
 // 獲取oss的AccessKeySecret
 String accessKeySecret = aliyunOssConfig.getAccessKeySecret();
 // 獲取oss的AccessKeyId
 String accessKeyId = aliyunOssConfig.getAccessKeyId();
 // 獲取oss目標文件夾
 String filehost = aliyunOssConfig.getFileHost();
 // 日期目錄
 // 注意,這里雖然寫成這種固定獲取日期目錄的形式,邏輯上確實存在問題,但是實際上,filePath的日期目錄應該是從數據庫查詢的
 String filePath = new DateTime().toString("yyyy/MM/dd");

 try {
 /**
 * 注意:在實際項目中,不需要刪除OSS文件服務器中的文件,
 * 只需要刪除數據庫存儲的文件路徑即可!
 */
 // 建議在方法中創建OSSClient 而不是使用@Bean注入,不然容易出現Connection pool shut down
 OSSClient ossClient = new OSSClient(endpoint,
  accessKeyId, accessKeySecret);
 // 根據BucketName,filetName刪除文件
 // 刪除目錄中的文件,如果是最后一個文件fileoath目錄會被刪除。
 String fileKey = filehost + "/" + filePath + "/" + fileName;
 ossClient.deleteObject(bucketName, fileKey);

 try {
 } finally {
 ossClient.shutdown();
 }
 System.out.println("文件刪除!");
 return StatusCode.SUCCESS.getMsg();
 } catch (Exception e) {
 e.printStackTrace();
 return StatusCode.ERROR.getMsg();
 }
 }
}

controller層

controller提供測試接口

/**
 * @Auther: csp1999
 * @Date: 2020/10/31/16:40
 * @Description: OSS 文件上傳controller
 */
@Api(description = "阿里云OSS文件上傳、下載、刪除API")
@RequestMapping("api/pri/file")
@RestController
public class OssFileController {
 @Autowired
 private FileUploadService fileUploadService;

 /*
 * 文件上傳api
 * @param: file
 * @return: com.alibaba.fastjson.JSONObject
 * @create: 2020/10/31 17:35
 * @author: csp1999
 */
 @ApiOperation(value = "文件上傳")
 @PostMapping("upload")
 public JSONObject upload(@RequestParam("file") MultipartFile file) {
 JSONObject jsonObject = new JSONObject();
 if (file != null) {
 String returnFileUrl = fileUploadService.upload(file);
 if (returnFileUrl.equals("error")) {
 jsonObject.put("error", "文件上傳失敗!");
 return jsonObject;
 }
 jsonObject.put("success", "文件上傳成功!");
 jsonObject.put("returnFileUrl", returnFileUrl);
 return jsonObject;
 } else {
 jsonObject.put("error", "文件上傳失敗!");
 return jsonObject;
 }
 }

 /*
 * 文件下載api
 * @param: fileName
 * @param: response
 * @return: com.alibaba.fastjson.JSONObject
 * @create: 2020/10/31 17:35
 * @author: csp1999
 */
 @ApiOperation(value = "文件下載")
 @GetMapping(value = "download/{fileName}")
 public JSONObject download(@PathVariable("fileName") String fileName, HttpServletResponse response) throws Exception {
 JSONObject jsonObject = new JSONObject();

 String status = fileUploadService.download(fileName, response);
 if (status.equals("error")) {
 jsonObject.put("error", "文件下載失敗!");
 return jsonObject;
 } else {
 jsonObject.put("success", "文件下載成功!");
 return jsonObject;
 }
 }

 /*
 * 文件刪除api
 * @param: fileName
 * @return: com.alibaba.fastjson.JSONObject
 * @create: 2020/10/31 17:35
 * @author: csp1999
 */
 @ApiOperation(value = "文件刪除")
 @GetMapping("/delete/{fileName}")
 public JSONObject DeleteFile(@PathVariable("fileName") String fileName) {
 JSONObject jsonObject = new JSONObject();

 String status = fileUploadService.delete(fileName);
 if (status.equals("error")) {
 jsonObject.put("error", "文件刪除失敗!");
 return jsonObject;
 } else {
 jsonObject.put("success", "文件刪除成功!");
 return jsonObject;
 }
 }
}

4.運行項目測試API接口

本機訪問:http://localhost:8083/swagger-ui.html

使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能

測試上傳:

使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能

結果如圖:

使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能

如果說明上傳成功,我們來看一下這個鏈接能不能訪問到:

使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能
使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能

關于使用springboot操作阿里云OSS實現文件上傳,下載,刪除等功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新源县| 吐鲁番市| 东光县| 临湘市| 汤阴县| 九龙县| 天全县| 珲春市| 中卫市| 咸丰县| 塔河县| 洪江市| 江城| 平潭县| 中宁县| 汽车| 正定县| 黄龙县| 邳州市| 宜都市| 揭东县| 成武县| 黄梅县| 洮南市| 黎川县| 长丰县| 综艺| 广平县| 敦煌市| 湟中县| 襄樊市| 余姚市| 甘泉县| 巩义市| 澎湖县| 湄潭县| 青浦区| 探索| 北票市| 黔西县| 五寨县|