¶Ô±ÈÐÂÎļþ |
| | |
| | | /* |
| | | * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * Redistributions in binary form must reproduce the above copyright |
| | | * notice, this list of conditions and the following disclaimer in the |
| | | * documentation and/or other materials provided with the distribution. |
| | | * Neither the name of the dreamlu.net developer nor the names of its |
| | | * contributors may be used to endorse or promote products derived from |
| | | * this software without specific prior written permission. |
| | | * Author: Chill åºéª (smallchill@163.com) |
| | | */ |
| | | package org.springblade.core.oss; |
| | | |
| | | import com.qiniu.common.Zone; |
| | | import com.qiniu.http.Response; |
| | | import com.qiniu.storage.BucketManager; |
| | | import com.qiniu.storage.UploadManager; |
| | | import com.qiniu.storage.model.FileInfo; |
| | | import com.qiniu.util.Auth; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.SneakyThrows; |
| | | import org.springblade.core.oss.model.BladeFile; |
| | | import org.springblade.core.oss.model.OssFile; |
| | | import org.springblade.core.oss.props.OssProperties; |
| | | import org.springblade.core.oss.rule.OssRule; |
| | | import org.springblade.core.tool.utils.CollectionUtil; |
| | | import org.springblade.core.tool.utils.Func; |
| | | import org.springblade.core.tool.utils.StringPool; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.InputStream; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * QiniuTemplate |
| | | * |
| | | * @author Chill |
| | | */ |
| | | @AllArgsConstructor |
| | | public class QiniuTemplate implements OssTemplate { |
| | | private final Auth auth; |
| | | private final UploadManager uploadManager; |
| | | private final BucketManager bucketManager; |
| | | private final OssProperties ossProperties; |
| | | private final OssRule ossRule; |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void makeBucket(String bucketName) { |
| | | if (!CollectionUtil.contains(bucketManager.buckets(), getBucketName(bucketName))) { |
| | | bucketManager.createBucket(getBucketName(bucketName), Zone.autoZone().getRegion()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void removeBucket(String bucketName) { |
| | | |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public boolean bucketExists(String bucketName) { |
| | | return CollectionUtil.contains(bucketManager.buckets(), getBucketName(bucketName)); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void copyFile(String bucketName, String fileName, String destBucketName) { |
| | | bucketManager.copy(getBucketName(bucketName), fileName, getBucketName(destBucketName), fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void copyFile(String bucketName, String fileName, String destBucketName, String destFileName) { |
| | | bucketManager.copy(getBucketName(bucketName), fileName, getBucketName(destBucketName), destFileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public OssFile statFile(String fileName) { |
| | | return statFile(ossProperties.getBucketName(), fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public OssFile statFile(String bucketName, String fileName) { |
| | | FileInfo stat = bucketManager.stat(getBucketName(bucketName), fileName); |
| | | OssFile ossFile = new OssFile(); |
| | | ossFile.setName(Func.isEmpty(stat.key) ? fileName : stat.key); |
| | | ossFile.setLink(fileLink(ossFile.getName())); |
| | | ossFile.setHash(stat.hash); |
| | | ossFile.setLength(stat.fsize); |
| | | ossFile.setPutTime(new Date(stat.putTime / 10000)); |
| | | ossFile.setContentType(stat.mimeType); |
| | | return ossFile; |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public String filePath(String fileName) { |
| | | return getBucketName().concat(StringPool.SLASH).concat(fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public String filePath(String bucketName, String fileName) { |
| | | return getBucketName(bucketName).concat(StringPool.SLASH).concat(fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public String fileLink(String fileName) { |
| | | return ossProperties.getEndpoint().concat(StringPool.SLASH).concat(fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public String fileLink(String bucketName, String fileName) { |
| | | return ossProperties.getEndpoint().concat(StringPool.SLASH).concat(fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public BladeFile putFile(MultipartFile file) { |
| | | return putFile(ossProperties.getBucketName(), file.getOriginalFilename(), file); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public BladeFile putFile(String fileName, MultipartFile file) { |
| | | return putFile(ossProperties.getBucketName(), fileName, file); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public BladeFile putFile(String bucketName, String fileName, MultipartFile file) { |
| | | return putFile(bucketName, fileName, file.getInputStream()); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public BladeFile putFile(String fileName, InputStream stream) { |
| | | return putFile(ossProperties.getBucketName(), fileName, stream); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public BladeFile putFile(String bucketName, String fileName, InputStream stream) { |
| | | return put(bucketName, stream, fileName, false); |
| | | } |
| | | |
| | | @SneakyThrows |
| | | public BladeFile put(String bucketName, InputStream stream, String key, boolean cover) { |
| | | makeBucket(bucketName); |
| | | String originalName = key; |
| | | key = getFileName(key); |
| | | // è¦çä¸ä¼ |
| | | if (cover) { |
| | | uploadManager.put(stream, key, getUploadToken(bucketName, key), null, null); |
| | | } else { |
| | | Response response = uploadManager.put(stream, key, getUploadToken(bucketName), null, null); |
| | | int retry = 0; |
| | | int retryCount = 5; |
| | | while (response.needRetry() && retry < retryCount) { |
| | | response = uploadManager.put(stream, key, getUploadToken(bucketName), null, null); |
| | | retry++; |
| | | } |
| | | } |
| | | BladeFile file = new BladeFile(); |
| | | file.setOriginalName(originalName); |
| | | file.setName(key); |
| | | file.setDomain(getOssHost()); |
| | | file.setLink(fileLink(bucketName, key)); |
| | | return file; |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void removeFile(String fileName) { |
| | | bucketManager.delete(getBucketName(), fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void removeFile(String bucketName, String fileName) { |
| | | bucketManager.delete(getBucketName(bucketName), fileName); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void removeFiles(List<String> fileNames) { |
| | | fileNames.forEach(this::removeFile); |
| | | } |
| | | |
| | | @Override |
| | | @SneakyThrows |
| | | public void removeFiles(String bucketName, List<String> fileNames) { |
| | | fileNames.forEach(fileName -> removeFile(getBucketName(bucketName), fileName)); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®è§åçæå卿¡¶åç§°è§å |
| | | * |
| | | * @return String |
| | | */ |
| | | private String getBucketName() { |
| | | return getBucketName(ossProperties.getBucketName()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®è§åçæå卿¡¶åç§°è§å |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @return String |
| | | */ |
| | | private String getBucketName(String bucketName) { |
| | | return ossRule.bucketName(bucketName); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®è§åçææä»¶åç§°è§å |
| | | * |
| | | * @param originalFilename åå§æä»¶å |
| | | * @return string |
| | | */ |
| | | private String getFileName(String originalFilename) { |
| | | return ossRule.fileName(originalFilename); |
| | | } |
| | | |
| | | /** |
| | | * è·åä¸ä¼ åè¯ï¼æ®éä¸ä¼ |
| | | */ |
| | | public String getUploadToken(String bucketName) { |
| | | return auth.uploadToken(getBucketName(bucketName)); |
| | | } |
| | | |
| | | /** |
| | | * è·åä¸ä¼ åè¯ï¼è¦çä¸ä¼ |
| | | */ |
| | | private String getUploadToken(String bucketName, String key) { |
| | | return auth.uploadToken(getBucketName(bucketName), key); |
| | | } |
| | | |
| | | /** |
| | | * è·ååå |
| | | * |
| | | * @return String |
| | | */ |
| | | public String getOssHost() { |
| | | return ossProperties.getEndpoint(); |
| | | } |
| | | |
| | | } |