MinIO实现文件上传存储

目录

MinIO概念

  1. MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它与 Amazon S3 云存储服务 API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。
  2. MinIO是高性能对象存储,什么是对象存储(Object Storage Service),对象存储是支持海量用户远程访问的无限容量廉价存储系统,即是存储系统。
  3. 它由桶(bucket,对应Windows下的文件夹),组成目录结构,桶中直接存放对象(Object,对应Windwos下的文件),桶中不能再创建桶,但是能创建文件夹。

MinIO下载安装启动

访问官网:https://docs.min.io/
进入官网点击右上角Download

下载

在这里插入图片描述
点击Windows下载服务端

在这里插入图片描述

安装

将MinIO.exe 拷贝到自己的目录下去,并创建一个data目录

在这里插入图片描述

启动

通过命令行启动Minio :
minio server ./data

在这里插入图片描述
启动完成后,可以看到访问的路径:http://127.0.0.1:9000

在这里插入图片描述
使用提供的账号密码进行登录

​ 账号:minioadmin

​ 密码:minioadmin

MinIO实现上传文件

导入maven坐标

<!--minio -->
<dependency>
     <groupId>io.minio</groupId>
     <artifactId>minio</artifactId>
     <version>8.4.3</version>
</dependency>

在application文件添加配置

# MinIO配置
minio:
  endpoint: 127.0.0.1
  port: 9000
  accessKey: minioadmin
  secretKey: minioadmin
  secure: false
  bucketName: "demo"
  configDir: "/data/excel"

实现代码

/**
 *  读取配置文件的内容赋值给属性
 */

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private final static String HTTP = "http://";

    //endPoint是一个URL,域名,IPv4或者IPv6地址
    private String endpoint;

    //TCP/IP端口号
    private int port;

    //accessKey类似于用户ID,用于唯一标识你的账户
    private String accessKey;

    //secretKey是你账户的密码
    private String secretKey;

    //如果是true,则用的是https而不是http,默认值是true
    private Boolean secure;

    //默认存储桶
    private String bucketName;
}
/**
 * 返回结果封装
 */
public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;

    /** 状态码 */
    public static final String CODE_TAG = "code";

    /** 返回内容 */
    public static final String MSG_TAG = "msg";

    /** 数据对象 */
    public static final String DATA_TAG = "data";

    /**
     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
     */
    public AjaxResult()
    {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     */
    public AjaxResult(int code, String msg)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String msg, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data))
        {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * 返回成功消息
     * 
     * @return 成功消息
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     * 
     * @return 成功消息
     */
    public static AjaxResult success(Object data)
    {
        return AjaxResult.success("操作成功", data);
    }

    /**
     * 返回成功消息
     * 
     * @param msg 返回内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg)
    {
        return AjaxResult.success(msg, null);
    }

    /**
     * 返回成功消息
     * 
     * @param msg 返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static AjaxResult success(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }

    /**
     * 返回错误消息
     * 
     * @return
     */
    public static AjaxResult error()
    {
        return AjaxResult.error("操作失败");
    }

    /**
     * 返回错误消息
     * 
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(String msg)
    {
        return AjaxResult.error(msg, null);
    }

    /**
     * 返回错误消息
     * 
     * @param msg 返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static AjaxResult error(String msg, Object data)
    {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }

    /**
     * 返回错误消息
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @return 警告消息
     */
    public static AjaxResult error(int code, String msg)
    {
        return new AjaxResult(code, msg, null);
    }
}
/**
 * 通用请求处理
 */
@RestController
public class CommonController extends BaseController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);

    @Autowired
    private ISysFileService fileService;


    /**
     * 通用上传请求
     */
    @PostMapping("/common/upload")
    public AjaxResult uploadFile(MultipartFile file){
        try{
            // 上传文件路径
            return fileService.upload(file);
        }catch (Exception e){
            return AjaxResult.error(e.getMessage());
        }
    }
}
public interface ISysFileService {

	/**
	 * 文件上传
	 * @param file
	 * @return
	 */
	AjaxResult upload(MultipartFile file);

}
@Service
@Slf4j
public class SysFileServiceImpl implements ISysFileService{

	@Autowired
	MinioConfig minioConfig;

	/**
	 * 文件上传至Minio
	 * 使用try catch finally进行上传
	 * finally里进行资源的回收
	 */
	@Override
	public AjaxResult upload(MultipartFile file) {
		InputStream inputStream = null;
		//创建Minio的连接对象
		MinioClient minioClient = getClient();
		//获取存储桶
		String bucketName = minioConfig.getBucketName();
		try {
			inputStream = file.getInputStream();

			// Make bucketName bucket if not exist.
			boolean found =
					minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
			if (!found) {
				// Make a new bucket called bucketName.
				minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
			} else {
				log.info("Bucket " +"["+bucketName+ "]"+" already exists.");
			}
			
			//Uploads given stream as object in bucket.
			String oldFileName = file.getOriginalFilename();
			String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date())+IdUtils.simpleUUID()+oldFileName.substring(oldFileName.lastIndexOf("."));
			minioClient.putObject(
					PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
							inputStream, file.getSize(), -1)
							.contentType(file.getContentType())
							.build());
			/**
			 * 构建返回结果集
			 */
			AjaxResult ajax = AjaxResult.success();
			/**
			 * 封装需要的数据进行返回
			 */
			ajax.put("fileName", "/"+bucketName+"/"+objectName);
			ajax.put("url", "http://"+minioConfig.getEndpoint()+":"+minioConfig.getPort()+"/"+minioConfig.getBucketName()+"/"+objectName);
			return ajax;
		}catch(Exception e){
			e.printStackTrace();
			return AjaxResult.error("上传失败");
		}finally {
			//防止内存泄漏
			if (inputStream != null) {
				try {
					inputStream.close(); // 关闭流
				} catch (IOException e) {
					log.debug("inputStream close IOException:" + e.getMessage());
				}
			}
		}
	}


	/**
	 * 提供一个获取Minio连接的方法
	 * 获取Minio连接
	 * @return
	 */
	private MinioClient getClient(){
		MinioClient minioClient =
				MinioClient.builder()
						.endpoint("http://"+minioConfig.getEndpoint()+":"+ minioConfig.getPort())
						.credentials(minioConfig.getAccessKey(),minioConfig.getSecretKey())
						.build();
		return minioClient;
	}
}

响应数据格式

{
	"msg":"操作成功",
	"fileName":"/demo/2022/10/14/efcb6266efba42a4b35344181964be36.pdf",
	"code":200,
	"url":"http://127.0.0.1:9000/demo/2022/10/14/efcb6266efba42a4b35344181964be36.pdf"
}

到此,上传文件到MinIO服务器就完成了。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以使用MinIO Java客户端来实现文件上传和下载。MinIO是一个基于对象存储的开源项目,可以提供高性能的文件存储和访问。 首先,你需要在你的Java项目中添加MinIO Java客户端的依赖。你可以在Maven或者Gradle配置文件中加入以下依赖: Maven: ```xml <dependencies> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.1.0</version> </dependency> </dependencies> ``` Gradle: ```groovy dependencies { implementation 'io.minio:minio:8.1.0' } ``` 接下来,你需要连接到MinIO服务器并进行认证。你可以使用以下代码完成: ```java import io.minio.MinioClient; public class MinioExample { public static void main(String[] args) { try { // 创建MinIO客户端对象 MinioClient minioClient = new MinioClient("http://your-minio-server-url", "access-key", "secret-key"); // 检查存储桶是否存在,如果不存在则创建 boolean isExist = minioClient.bucketExists("your-bucket"); if (!isExist) { minioClient.makeBucket("your-bucket"); } // 上传文件 minioClient.putObject("your-bucket", "your-object-name", "/path/to/your-file"); // 下载文件 minioClient.getObject("your-bucket", "your-object-name", "/path/to/save-file"); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,你需要替换以下参数: - `your-minio-server-url`:MinIO服务器的URL地址。 - `access-key`:你的MinIO访问密钥。 - `secret-key`:你的MinIO密钥。 - `your-bucket`:存储桶的名称。 - `your-object-name`:对象的名称。 - `/path/to/your-file`:待上传的文件路径。 - `/path/to/save-file`:下载文件保存的路径。 通过上述代码,你可以使用MinIO Java客户端实现文件上传和下载。希望对你有帮助!如有任何问题,请随时提出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

改啥名不重复

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值