import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.base.Throwables;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.ObjectWriteArgs;
import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import io.minio.SetBucketPolicyArgs;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.*
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* MinIO对象存储管理Controller
*/
@Slf4j
@Api(value = "MinIO对象存储管理")
@Controller
@RequestMapping("/minio")
public class MinioController {
private static final Logger LOGGER = LoggerFactory.getLogger(MinioController.class);
@Value("${minio.endpoint}")
private String ENDPOINT;
@Value("${minio.bucketName}")
private String BUCKET_NAME;
@Value("${minio.accessKey}")
private String ACCESS_KEY;
@Value("${minio.secretKey}")
private String SECRET_KEY;
@ApiOperation("文件上传")
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public Result upload(@RequestParam("file") MultipartFile file) {
try {
//创建一个MinIO的Java客户端
MinioClient minioClient = MinioClient.builder()
.endpoint(ENDPOINT)
.credentials(ACCESS_KEY, SECRET_KEY)
.build();
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(BUCKET_NAME).build());
if (isExist) {
LOGGER.info("存储桶已经存在!");
} else {
//创建存储桶并设置只读权限
minioClient.makeBucket(MakeBucketArgs.builder().bucket(BUCKET_NAME).build());
BucketPolicyConfigDTO bucketPolicyConfigDto = createBucketPolicyConfigDto(BUCKET_NAME);
SetBucketPolicyArgs setBucketPolicyArgs = SetBucketPolicyArgs.builder()
.bucket(BUCKET_NAME)
.config(bucketPolicyConfigDto.toJson())
.build();
minioClient.setBucketPolicy(setBucketPolicyArgs);
}
String filename = file.getOriginalFilename();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// 设置存储对象名称
String objectName = sdf.format(new Date()) + "/" + filename;
// 使用putObject上传一个文件到存储桶中
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(BUCKET_NAME)
.object(objectName)
.contentType(file.getContentType())
.stream(file.getInputStream(), file.getSize(), ObjectWriteArgs.MIN_MULTIPART_SIZE).build();
minioClient.putObject(putObjectArgs);
LOGGER.info("文件上传成功!");
MinioUploadDTO minioUploadDto = new MinioUploadDTO();
minioUploadDto.setName(filename);
minioUploadDto.setUrl(ENDPOINT + "/" + BUCKET_NAME + "/" + objectName);
return Result.setSucData(minioUploadDto);
} catch (Exception e) {
e.printStackTrace();
LOGGER.info("上传发生错误: {}!", e.getMessage());
}
return Result.setErrorMsg("上传失败");
}
private BucketPolicyConfigDTO createBucketPolicyConfigDto(String bucketName) {
BucketPolicyConfigDTO.Statement statement = BucketPolicyConfigDTO.Statement.builder()
.effect("Allow")
.principal("*")
.action("s3:GetObject")
.resource("arn:aws:s3:::" + bucketName + "/*.**").build();
return BucketPolicyConfigDTO.builder()
.version("2012-10-17")
.statement(CollUtil.toList(statement))
.build();
}
@ApiOperation("文件删除")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public Result delete(@RequestParam("objectName") String objectName) {
try {
MinioClient minioClient = MinioClient.builder()
.endpoint(ENDPOINT)
.credentials(ACCESS_KEY, SECRET_KEY)
.build();
minioClient.removeObject(RemoveObjectArgs.builder().bucket(BUCKET_NAME).object(objectName).build());
return Result.setSucData(null);
} catch (Exception e) {
e.printStackTrace();
}
return Result.setErrorMsg("删除失败!");
}
@ApiOperation("minio图片预览")
@GetMapping(value = "/view")
public void view(@RequestParam("url") String url, HttpServletResponse response) {
// jdk1.7 以下,记得关流
try (ServletOutputStream outputStream = response.getOutputStream()) {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
if (conn.getResponseCode() == 200) {
//通过输入流获取图片数据 得到图片的二进制数据
outputStream.write(readInputStream(conn.getInputStream()));
}
} catch (Throwable e) {
log.error(Throwables.getStackTraceAsString(e));
}
}
@ApiOperation("minio文件下载")
@GetMapping(value = "/download")
public void download(@RequestParam("url") String url, HttpServletResponse response) {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
String[] split = StrUtil.split(url, "/");
response.addHeader("Content-Disposition", "attachment; filename=\"" + split[split.length - 1] + "\"");
int bytesum = 0;
int byteread = 0;
int code = conn.getResponseCode();
//如果状态码为200表示请求成功
if (code == 200) {
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(readInputStream(conn.getInputStream()));
}
} catch (Exception e) {
log.error(Throwables.getStackTraceAsString(e));
}
}
/**
* 从输入流中获取数据
*
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
public static void main(String[] args) throws Exception {
String str = "ip:8080/activityPicture/20210715/d21eb552-f5f0-4326-a2c6-b3ef8f0b38ab.默认文件1626335090121.png";
//加密url
String s = Base64.encodeBase64String(str.getBytes("UTF-8"));
System.out.println(s);
//转成普通字符串传
String encode = URLEncoder.encode(s, "UTF-8");
System.out.println(encode);
//解密
String s1 = new String(Base64.decodeBase64(s), "UTF-8");
System.out.println(s1);
}
}
minIO 文件上传下载
最新推荐文章于 2024-05-17 16:07:54 发布