javascript
SpringBoot整合oss实现文件的上传,查看,删除,下载
springboot整合oss實現文件的上傳,查看,刪除,下載
1.什么是對象存儲 OSS?
答:阿里云對象存儲服務(Object Storage Service,簡稱 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存儲服務。其數據設計持久性不低于 99.9999999999%(12 個 9),服務設計可用性(或業務連續性)不低于 99.995%。
OSS 具有與平臺無關的 RESTful API 接口,您可以在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
您可以使用阿里云提供的 API、SDK 接口或者 OSS 遷移工具輕松地將海量數據移入或移出阿里云 OSS。數據存儲到阿里云 OSS 以后,您可以選擇標準存儲(Standard)作為移動應用、大型網站、圖片分享或熱點音視頻的主要存儲方式,也可以選擇成本更低、存儲期限更長的低頻訪問存儲(Infrequent Access)和歸檔存儲(Archive)作為不經常訪問數據的存儲方式。
有關oss更多,更詳細的介紹請參考阿里云oss對象儲存官方文檔地址
2.登錄阿里云,進入到控制臺
3.創建Bucket
點擊確定,這樣我們就建好了。
下面我們來開始寫代碼?
新建一個spring boot項目
導入如下依賴
pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version><scope>provided</scope></dependency><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.9.9</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version></dependency>application.properties配置文件
accessKeyId、accessKeySecret需要在accesskeys里面查看
編寫一個配置文件AliyunConfig.class
package com.tuanzi.config;import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClient; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /*** @desc*/ @Configuration @PropertySource(value = {"classpath:application.properties"}) @ConfigurationProperties(prefix = "aliyun") @Data public class AliyunConfig {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;private String urlPrefix;@Beanpublic OSS oSSClient() {return new OSSClient(endpoint, accessKeyId, accessKeySecret);} }controller類
package com.tuanzi.controller;import com.tuanzi.service.FileUploadService; import com.tuanzi.vo.FileUploadResult; import com.aliyun.oss.model.OSSObjectSummary; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List;/*** @desc*/ @Controller public class FileUploadController {@Autowiredprivate FileUploadService fileUploadService;/*** @desc 文件上傳到oss* @return FileUploadResult* @Param uploadFile*/@RequestMapping("file/upload")@ResponseBodypublic FileUploadResult upload(@RequestParam("file") MultipartFile uploadFile)throws Exception {return this.fileUploadService.upload(uploadFile);}/*** @return FileUploadResult* @desc 根據文件名刪除oss上的文件* @Param objectName*/@RequestMapping("file/delete")@ResponseBodypublic FileUploadResult delete(@RequestParam("fileName") String objectName)throws Exception {return this.fileUploadService.delete(objectName);}/*** @desc 查詢oss上的所有文件* @return List<OSSObjectSummary>* @Param*/@RequestMapping("file/list")@ResponseBodypublic List<OSSObjectSummary> list()throws Exception {return this.fileUploadService.list();}/*** @desc 根據文件名下載oss上的文件* @return* @Param objectName*/@RequestMapping("file/download")@ResponseBodypublic void download(@RequestParam("fileName") String objectName, HttpServletResponse response) throws IOException {//通知瀏覽器以附件形式下載response.setHeader("Content-Disposition","attachment;filename=" + new String(objectName.getBytes(), "ISO-8859-1"));this.fileUploadService.exportOssFile(response.getOutputStream(),objectName);} }service
package com.tuanzi.service;import com.tuanzi.config.AliyunConfig; import com.tuanzi.vo.FileUploadResult; import com.aliyun.oss.OSS; import com.aliyun.oss.model.*; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile;import java.io.*; import java.util.List;/*** @desc*/ @Service public class FileUploadService {// 允許上傳的格式private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",".jpeg", ".gif", ".png"};@Autowiredprivate OSS ossClient;@Autowiredprivate AliyunConfig aliyunConfig;/*** @desc 文件上傳*/public FileUploadResult upload(MultipartFile uploadFile) {// 校驗圖片格式boolean isLegal = false;for (String type : IMAGE_TYPE) {if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),type)) {isLegal = true;break;}}//封裝Result對象,并且將文件的byte數組放置到result對象中FileUploadResult fileUploadResult = new FileUploadResult();if (!isLegal) {fileUploadResult.setStatus("error");return fileUploadResult;}//文件新路徑String fileName = uploadFile.getOriginalFilename();String filePath = getFilePath(fileName);// 上傳到阿里云try {ossClient.putObject(aliyunConfig.getBucketName(), filePath, newByteArrayInputStream(uploadFile.getBytes()));} catch (Exception e) {e.printStackTrace();//上傳失敗fileUploadResult.setStatus("error");return fileUploadResult;}fileUploadResult.setStatus("done");fileUploadResult.setResponse("success");fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));return fileUploadResult;}/*** @desc 生成路徑以及文件名 例如://images/2019/08/10/15564277465972939.jpg*/private String getFilePath(String sourceFileName) {DateTime dateTime = new DateTime();return "images/" + dateTime.toString("yyyy")+ "/" + dateTime.toString("MM") + "/"+ dateTime.toString("dd") + "/" + System.currentTimeMillis() +RandomUtils.nextInt(100, 9999) + "." +StringUtils.substringAfterLast(sourceFileName, ".");}/*** @desc 查看文件列表*/public List<OSSObjectSummary> list() {// 設置最大個數。final int maxKeys = 200;// 列舉文件。ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));List<OSSObjectSummary> sums = objectListing.getObjectSummaries();return sums;}/*** @desc 刪除文件*/public FileUploadResult delete(String objectName) {// 根據BucketName,objectName刪除文件ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);FileUploadResult fileUploadResult = new FileUploadResult();fileUploadResult.setName(objectName);fileUploadResult.setStatus("removed");fileUploadResult.setResponse("success");return fileUploadResult;}/*** @desc 下載文件*/public void exportOssFile(OutputStream os, String objectName) throws IOException {// ossObject包含文件所在的存儲空間名稱、文件名稱、文件元信息以及一個輸入流。OSSObject ossObject = ossClient.getObject(aliyunConfig.getBucketName(), objectName);// 讀取文件內容。BufferedInputStream in = new BufferedInputStream(ossObject.getObjectContent());BufferedOutputStream out = new BufferedOutputStream(os);byte[] buffer = new byte[1024];int lenght = 0;while ((lenght = in.read(buffer)) != -1) {out.write(buffer, 0, lenght);}if (out != null) {out.flush();out.close();}if (in != null) {in.close();}} }返回值類
package com.tuanzi.vo;import lombok.Data;/*** @desc 返回值*/ @Data public class FileUploadResult {// 文件唯一標識private String uid;// 文件名private String name;// 狀態有:uploading done error removedprivate String status;// 服務端響應內容,如:'{"status": "success"}'private String response; }這樣就完成了
我們來運行一下項目
看看效果:訪問http://localhost:8080/upload.html
我們來上傳一個不符合格式的圖片,會有提示信息
來上傳一個符合的
上傳成功后會直接顯示出來。我們來看看oss里面是否有我們上傳的圖片
發現也有
接下來我們來測試一下查詢,下載,和刪除
訪問:http://localhost:8080/manager.html
會看到我們上傳的圖片
這里簡單的寫了個例子
下載圖片
刪除圖片
來看看oss里面
也已經刪除了!!!
總結
以上是生活随笔為你收集整理的SpringBoot整合oss实现文件的上传,查看,删除,下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI理论知识基础(20)-线性变换(2)
- 下一篇: 在SpringBoot中使用slf4j与