引入maven
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!--阿里雲oss--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.2</version> </dependency>
阿里雲oss上傳工具類
AliOssCloudUtil.java
package com.test.cms.aliyunoss; import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.*; /** * 阿里雲 OSS文件類 */ public class AliOssCloudUtil { Log log = LogFactory.getLog(AliOssCloudUtil.class); private String endpoint = "oss-cn-hangzhou.aliyuncs.com";
//阿里雲的accessKeyId private String accessKeyId = "LTAI4GBP";
//阿里雲的accessKeySecret
private String accessKeySecret = "mwpBLG"; //空間 private String bucketName = "js"; //文件存儲目錄 private String filedir = "val/"; private OSSClient ossClient; public AliOssCloudUtil() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } public String getFiledir() { return this.filedir; } //自定義上傳文件夾 public AliOssCloudUtil(String filedir) { this.filedir = filedir; ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 初始化 */ public void init() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 銷毀 */ public void destory() { ossClient.shutdown(); } /** * 上傳到OSS服務器 * * @param instream 文件流 * @param fileName 文件名稱 包括后綴名 * @return 出錯返回"" ,唯一MD5數字簽名 */ public String uploadFile2OSS(InputStream instream, String fileName) { String ret = ""; // 判斷bucket是否已經存在,不存在進行創建 if (!doesBucketExist()) { createBucket(); } try { //創建上傳Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(instream.available()); objectMetadata.setCacheControl("no-cache"); objectMetadata.setHeader("Pragma", "no-cache"); objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf(".")))); objectMetadata.setContentDisposition("inline;filename=" + fileName); // 指定上傳文件操作時是否覆蓋同名Object。 // 不指定x-oss-forbid-overwrite時,默認覆蓋同名Object。 // 指定x-oss-forbid-overwrite為false時,表示允許覆蓋同名Object。 // 指定x-oss-forbid-overwrite為true時,表示禁止覆蓋同名Object,如果同名Object已存在,程序將報錯。 objectMetadata.setHeader("x-oss-forbid-overwrite", "false"); String objectName = filedir + fileName; //上傳文件 ossClient.putObject(bucketName, objectName, instream, objectMetadata); // 封裝 url 路徑 String url = "http://" + bucketName + "." + endpoint + "/" + objectName; System.out.println(objectName); ret = url; } catch (IOException e) { log.error(e.getMessage(), e); } finally { ossClient.shutdown(); try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret; } /** * 判斷文件是否存在。doesObjectExist還有一個參數isOnlyInOSS, * 如果為true則忽略302重定向或鏡像;如果為false,則考慮302重定向或鏡像。 * yourObjectName 表示上傳文件到OSS時需要指定包含文件后綴在內的完整路徑,例如abc/efg/123.jpg。 * * @return 存在返回true */ public boolean doesObjectExist(String objectName) { boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName); return exists; } /** * 判斷Bucket是否存在 * * @return 存在返回true */ public boolean doesBucketExist() { boolean exists = ossClient.doesBucketExist(bucketName); return exists; } /** * 創建Bucket */ public void createBucket() { CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); // 設置bucket權限為公共讀,默認是私有讀寫 createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); // 設置bucket存儲類型為低頻訪問類型,默認是標准類型 createBucketRequest.setStorageClass(StorageClass.IA); boolean exists = ossClient.doesBucketExist(bucketName); if (!exists) { try { ossClient.createBucket(createBucketRequest); // 關閉client ossClient.shutdown(); } catch (Exception e) { log.error(e.getMessage()); } } } /** * Description: 判斷OSS服務文件上傳時文件的contentType * * @param FilenameExtension 文件后綴 * @return String */ public static String getcontentType(String FilenameExtension) { if ("bmp".equalsIgnoreCase(FilenameExtension)) { return "image/bmp"; } if ("gif".equalsIgnoreCase(FilenameExtension)) { return "image/gif"; } if ("jpeg".equalsIgnoreCase(FilenameExtension) || "jpg".equalsIgnoreCase(FilenameExtension) || "png".equalsIgnoreCase(FilenameExtension)) { return "image/jpeg"; } if ("html".equalsIgnoreCase(FilenameExtension)) { return "text/html"; } if ("txt".equalsIgnoreCase(FilenameExtension)) { return "text/plain"; } if ("vsd".equalsIgnoreCase(FilenameExtension)) { return "application/vnd.visio"; } if ("pptx".equalsIgnoreCase(FilenameExtension) || "ppt".equalsIgnoreCase(FilenameExtension)) { return "application/vnd.ms-powerpoint"; } if ("docx".equalsIgnoreCase(FilenameExtension) || "doc".equalsIgnoreCase(FilenameExtension)) { return "application/msword"; } if ("xml".equalsIgnoreCase(FilenameExtension)) { return "text/xml"; } return "image/jpeg"; } /** * @param fileName * @return * @Title: getInputStreamByFileUrl * @Description: 根據文件路徑獲取InputStream流 * @return: InputStream */ public InputStream getInputStreamByFileUrl(String fileName) { // ossObject包含文件所在的存儲空間名稱、文件名稱、文件元信息以及一個輸入流。 OSSObject ossObject = ossClient.getObject(bucketName, fileName); return ossObject.getObjectContent(); } }
控制器類(調用類)
FileUploadController.java
package com.test.cms.controller; import com.test.cms.aliyunoss.AliOssCloudUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.UUID; @RestController public class FileUploadController { /** * 文件上傳 * @param file * @return */ @PostMapping("/file/upload") public String upload(@RequestParam("file") MultipartFile file) { String filename = file.getResource().getFilename(); //這里文件名用了uuid 防止重復,可以根據自己的需要來寫 String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length()); name = name.replace("-", ""); InputStream inputStream = null; try { inputStream = file.getInputStream(); } catch (IOException e) { e.printStackTrace(); System.out.println("上傳失敗"); } AliOssCloudUtil util = new AliOssCloudUtil(); //上傳成功返回完整路徑的url String url = util.uploadFile2OSS(inputStream, name); return url; } /** * 判斷文件是否存在 * @param fileName 儲存的文件名 * @return */ @GetMapping("/file/exists") public Boolean exists(String fileName) { AliOssCloudUtil util = new AliOssCloudUtil(); Boolean bool = util.doesObjectExist(fileName); return bool; } /** * 下載oss對應文件 * @param fileName 儲存的文件名 * @return */ @PostMapping("/file/downLoad") public void downloadFile(String fileName, HttpServletResponse response) { try { AliOssCloudUtil ossClientUtil = new AliOssCloudUtil(); InputStream is = ossClientUtil.getInputStreamByFileUrl(ossClientUtil.getFiledir() + fileName); // 配置文件下載 response.setHeader("content-type", "application/octet-stream"); response.setContentType("application/octet-stream"); // 下載文件能正常顯示中文 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); OutputStream os = response.getOutputStream(); byte[] b = new byte[1024]; int len = -1; while ((len = is.read(b)) != -1) { os.write(b, 0, len); } is.close(); os.close(); } catch (Exception e) { e.printStackTrace(); } } }