1.配置類
pom 檔案添加依賴
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency>
/** * @author sun * @date 2019/5/8 000817:41 */ public class AliyunOSSConfigConstant { //私有構造方法 禁止該類初始化 private AliyunOSSConfigConstant() { } //倉庫名稱 public static final String BUCKE_NAME = "cangku"; //地域節點 我選的深圳 public static final String END_POINT = "oss-cn-shenzhen.aliyuncs.com"; //AccessKey ID 阿裡雲AccessKey public static final String AccessKey_ID = "LTA1aaPaMi66tCy1"; //Access Key Secret 阿裡雲Secret public static final String AccessKey_Secret = "bQ9Re8uV12sasa1KhWdWAbb15EM7w12"; }
2.工具類
@Component public class AliyunOSSUtil { private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class); private static String FILE_URL; private static String bucketName = AliyunOSSConfigConstant.BUCKE_NAME; private static String endpoint = AliyunOSSConfigConstant.END_POINT; private static String accessKeyId = AliyunOSSConfigConstant.AccessKey_ID; private static String accessKeySecret = AliyunOSSConfigConstant.AccessKey_Secret; /** * 上傳檔案。 * * @param file 需要上傳的檔案路徑 * @return 如果上傳的檔案是圖檔的話,會傳回圖檔的"URL",如果非圖檔的話會傳回"非圖檔,不可預覽。檔案路徑為:+檔案路徑" */ public static String upLoad(File file, String fileHost, String suffix) { // 預設值為:true boolean isImage = true; // 判斷所要上傳的圖檔是否是圖檔,圖檔可以預覽,其他檔案不提供通過URL預覽 try { Image image = ImageIO.read(file); isImage = image == null ? false : true; } catch (IOException e) { e.printStackTrace(); } logger.info("------OSS檔案上傳開始--------" + file.getName()); // 檔案名格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss"); String dateString = sdf.format(new Date()) + "." + suffix; // 20180322010634.jpg // 判斷檔案 if (file == null) { return null; } // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); try { // 判斷容器是否存在,不存在就建立 if (!ossClient.doesBucketExist(bucketName)) { ossClient.createBucket(bucketName); CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); ossClient.createBucket(createBucketRequest); } // 設定檔案路徑和名稱 // String fileUrl = fileHost + "/" + (dateString + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName()); String fileUrl = fileHost + "/" + dateString; if (isImage) {//如果是圖檔,則圖檔的URL為:.... FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl; } else { FILE_URL = fileUrl; logger.info("非圖檔,不可預覽。檔案路徑為:" + fileUrl); } // 上傳檔案 PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file)); // 設定權限(公開讀) ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); if (result != null) { logger.info("------OSS檔案上傳成功------" + fileUrl); } } catch (OSSException oe) { logger.error(oe.getMessage()); } catch (ClientException ce) { logger.error(ce.getErrorMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } return FILE_URL; } /** * 通過檔案名下載下傳檔案 * * @param objectName 要下載下傳的檔案名 * @param localFileName 本地要建立的檔案名 */ public static void downloadFile(String objectName, String localFileName) { // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 下載下傳OSS檔案到本地檔案。如果指定的本地檔案存在會覆寫,不存在則建立。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName)); // 關閉OSSClient。 ossClient.shutdown(); } /** * 删除檔案 * objectName key 位址 * * @param filePath */ public static Boolean delFile(String filePath) { logger.info("删除開始,objectName=" + filePath); // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 删除Object. boolean exist = ossClient.doesObjectExist(bucketName, filePath); if (!exist) { logger.error("檔案不存在,filePath={}", filePath); return false; } logger.info("删除檔案,filePath={}", filePath); ossClient.deleteObject(bucketName, filePath); ossClient.shutdown(); return true; } /** * 批量删除 * * @param keys */ public static Boolean delFileList(List<String> keys) { // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); try { // 删除檔案。 DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys)); List<String> deletedObjects = deleteObjectsResult.getDeletedObjects(); } catch (Exception e) { e.printStackTrace(); return false; } finally { ossClient.shutdown(); } return true; } /** * 擷取檔案夾 * * @param fileName * @return */ public static List<String> fileFolder(String fileName) { // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 構造ListObjectsRequest請求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設定正斜線(/)為檔案夾的分隔符。 listObjectsRequest.setDelimiter("/"); // 設定prefix參數來擷取fun目錄下的所有檔案。 if (StringUtils.isNotBlank(fileName)) { listObjectsRequest.setPrefix(fileName + "/"); } // 列出檔案 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 周遊所有commonPrefix List<String> list = new ArrayList<>(); for (String commonPrefix : listing.getCommonPrefixes()) { String newCommonPrefix = commonPrefix.substring(0, commonPrefix.length() - 1); String[] s = newCommonPrefix.split("/"); list.add(s[1]); } // 關閉OSSClient ossClient.shutdown(); return list; } /** * 列舉檔案下所有的檔案url資訊 */ public static List<String> listFile(String fileHost) { // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 構造ListObjectsRequest請求 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設定prefix參數來擷取fun目錄下的所有檔案。 listObjectsRequest.setPrefix(fileHost + "/"); // 列出檔案。 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 周遊所有檔案。 List<String> list = new ArrayList<>(); for (int i = 0; i < listing.getObjectSummaries().size(); i++) { if (i == 0) { continue; } FILE_URL = "https://" + bucketName + "." + endpoint + "/" + listing.getObjectSummaries().get(i).getKey(); list.add(FILE_URL); } // 關閉OSSClient。 ossClient.shutdown(); return list; } /** * 獲得url連結 * * @param objectName * @return */ public static String getUrl(String objectName) { // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 設定權限(公開讀) ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); // 設定圖檔處理樣式。 // String style = "image/resize,m_fixed,w_100,h_100/rotate,90"; Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 100); GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET); req.setExpiration(expiration); // req.setProcess(style); URL signedUrl = ossClient.generatePresignedUrl(req); // 關閉OSSClient。 logger.info("------OSS檔案檔案資訊--------" + signedUrl.toString()); ossClient.shutdown(); if (signedUrl != null) { return signedUrl.toString(); } return null; } // 擷取文 MultipartFile 檔案字尾名工具 public static String getSuffix(MultipartFile fileupload) { String originalFilename = fileupload.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); System.out.println(suffix); return suffix; } /** * 建立檔案夾 * * @param folder * @return */ public static String createFolder(String folder) { // 建立OSSClient執行個體。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 檔案夾名 final String keySuffixWithSlash = folder; // 判斷檔案夾是否存在,不存在則建立 if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { // 建立檔案夾 ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); logger.info("建立檔案夾成功"); // 得到檔案夾名 OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); String fileDir = object.getKey(); ossClient.shutdown(); return fileDir; } return keySuffixWithSlash; } public static void main(String[] args) { // createFolder("test/"); // getUrl("product/class/26065946787446951.jpg"); listFile("document"); // fileFolder(null); // fileFolder("document"); // String bucketUrl = "https://jiangpin.oss-cn-shenzhen.aliyuncs.com/other/20190509023515.jpg"; // String[] s = bucketUrl.split(".com"); // String path = s[1]; // path = path.substring(1, path.length()); // System.out.println(path); }
3.接口調用service
public ServiceResult<Object> uploadFile(MultipartFile file, String fileHost) { ServiceResult<Object> serviceResult = new ServiceResult<>(); logger.info("檔案上傳"); String suffix = aliyunOSSUtil.getSuffix(file); String filename = file.getOriginalFilename(); logger.info("檔案上傳filename =" + filename); try { if (file != null) { if (!"".equals(filename.trim())) { File newFile = new File(filename); FileOutputStream os = new FileOutputStream(newFile); os.write(file.getBytes()); os.close(); file.transferTo(newFile); // 上傳到OSS String uploadUrl = aliyunOSSUtil.upLoad(newFile, fileHost, suffix); logger.info("檔案上傳結束uploadUrl =" + uploadUrl); serviceResult.setData(uploadUrl); serviceResult.setMsg("成功"); serviceResult.setSucceed(true); return serviceResult; } } } catch (Exception ex) { ex.printStackTrace(); } return null; }