|
@@ -0,0 +1,228 @@
|
|
|
+package edu.travel.upload.minio;
|
|
|
+
|
|
|
+import edu.travel.upload.minio.property.MinioProperties;
|
|
|
+import io.minio.MinioClient;
|
|
|
+import io.minio.ObjectStat;
|
|
|
+import io.minio.PutObjectOptions;
|
|
|
+import io.minio.Result;
|
|
|
+import io.minio.messages.Bucket;
|
|
|
+import io.minio.messages.Item;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+import org.springframework.web.util.UriUtils;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+@Configuration
|
|
|
+@ConditionalOnClass(MinioClient.class)
|
|
|
+public class CloudMinioUtils {
|
|
|
+ @Autowired
|
|
|
+ private MinioClient minioClient;
|
|
|
+ @Autowired
|
|
|
+ private MinioProperties minioProperties;
|
|
|
+ /**
|
|
|
+ * 上传
|
|
|
+ */
|
|
|
+ public String putObject(MultipartFile multipartFile) throws Exception {
|
|
|
+ // bucket 不存在,创建
|
|
|
+ if (!minioClient.bucketExists(minioProperties.getBucket())) {
|
|
|
+ minioClient.makeBucket(minioProperties.getBucket());
|
|
|
+ }
|
|
|
+ try (InputStream inputStream = multipartFile.getInputStream()) {
|
|
|
+ // 上传文件的名称
|
|
|
+ String fileName = multipartFile.getOriginalFilename();
|
|
|
+ // PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
|
|
|
+ PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
|
|
|
+ // 文件的ContentType
|
|
|
+ putObjectOptions.setContentType(multipartFile.getContentType());
|
|
|
+ minioClient.putObject(minioProperties.getBucket(), fileName, inputStream, putObjectOptions);
|
|
|
+ // 返回访问路径
|
|
|
+ return minioProperties.getUrl() + UriUtils.encode(fileName, StandardCharsets.UTF_8);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 文件下载
|
|
|
+ */
|
|
|
+ public void download(String fileName, HttpServletResponse response){
|
|
|
+ // 从链接中得到文件名
|
|
|
+ InputStream inputStream;
|
|
|
+ try {
|
|
|
+
|
|
|
+ ObjectStat stat = minioClient.statObject(minioProperties.getBucket(), fileName);
|
|
|
+ inputStream = minioClient.getObject(minioProperties.getBucket(), fileName);
|
|
|
+ response.setContentType(stat.contentType());
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
+ int length;
|
|
|
+ while ((length = inputStream.read(buffer)) > 0) {
|
|
|
+ response.getOutputStream().write(buffer, 0, length);
|
|
|
+ }
|
|
|
+ inputStream.close();
|
|
|
+ } catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ System.out.println("有异常:" + e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 列出所有存储桶名称
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public List<String> listBucketNames()
|
|
|
+ throws Exception {
|
|
|
+ List<Bucket> bucketList = listBuckets();
|
|
|
+ List<String> bucketListName = new ArrayList<>();
|
|
|
+ for (Bucket bucket : bucketList) {
|
|
|
+ bucketListName.add(bucket.name());
|
|
|
+ }
|
|
|
+ return bucketListName;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查看所有桶
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public List<Bucket> listBuckets()
|
|
|
+ throws Exception {
|
|
|
+ return minioClient.listBuckets();
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 检查存储桶是否存在
|
|
|
+ *
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public boolean bucketExists(String bucketName) throws Exception {
|
|
|
+ boolean flag = minioClient.bucketExists(bucketName);
|
|
|
+ if (flag) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 创建存储桶
|
|
|
+ *
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public boolean makeBucket(String bucketName)
|
|
|
+ throws Exception {
|
|
|
+ boolean flag = bucketExists(bucketName);
|
|
|
+ if (!flag) {
|
|
|
+ minioClient.makeBucket(bucketName);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 删除桶
|
|
|
+ *
|
|
|
+ * @param bucketName
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public boolean removeBucket(String bucketName)
|
|
|
+ throws Exception {
|
|
|
+ boolean flag = bucketExists(bucketName);
|
|
|
+ if (flag) {
|
|
|
+ Iterable<Result<Item>> myObjects = listObjects(bucketName);
|
|
|
+ for (Result<Item> result : myObjects) {
|
|
|
+ Item item = result.get();
|
|
|
+ // 有对象文件,则删除失败
|
|
|
+ if (item.size() > 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 删除存储桶,注意,只有存储桶为空时才能删除成功。
|
|
|
+ minioClient.removeBucket(bucketName);
|
|
|
+ flag = bucketExists(bucketName);
|
|
|
+ if (!flag) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 列出存储桶中的所有对象
|
|
|
+ *
|
|
|
+ * @param bucketName 存储桶名称
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {
|
|
|
+ boolean flag = bucketExists(bucketName);
|
|
|
+ if (flag) {
|
|
|
+ return minioClient.listObjects(bucketName);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 列出存储桶中的所有对象名称
|
|
|
+ *
|
|
|
+ * @param bucketName 存储桶名称
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public List<String> listObjectNames(String bucketName) throws Exception {
|
|
|
+ List<String> listObjectNames = new ArrayList<>();
|
|
|
+ boolean flag = bucketExists(bucketName);
|
|
|
+ if (flag) {
|
|
|
+ Iterable<Result<Item>> myObjects = listObjects(bucketName);
|
|
|
+ for (Result<Item> result : myObjects) {
|
|
|
+ Item item = result.get();
|
|
|
+ listObjectNames.add(item.objectName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return listObjectNames;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 删除一个对象
|
|
|
+ *
|
|
|
+ * @param bucketName 存储桶名称
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public boolean removeObject(String bucketName, String objectName) throws Exception {
|
|
|
+ boolean flag = bucketExists(bucketName);
|
|
|
+ if (flag) {
|
|
|
+ List<String> objectList = listObjectNames(bucketName);
|
|
|
+ for (String s : objectList) {
|
|
|
+ if(s.equals(objectName)){
|
|
|
+ minioClient.removeObject(bucketName, objectName);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 文件访问路径
|
|
|
+ *
|
|
|
+ * @param bucketName 存储桶名称
|
|
|
+ * @param objectName 存储桶里的对象名称
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public String getObjectUrl(String bucketName, String objectName) throws Exception {
|
|
|
+ boolean flag = bucketExists(bucketName);
|
|
|
+ String url = "";
|
|
|
+ if (flag) {
|
|
|
+ url = minioClient.getObjectUrl(bucketName, objectName);
|
|
|
+ }
|
|
|
+ return url;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|