minIO 下载安装和实现上传功能

本文详细介绍了如何通过Java与Minio集成,包括设置Minio服务器、配置依赖、上传文件并管理存储路径。重点展示了如何在pom.xml中引入Minio依赖,以及如何在服务和控制器层面实现文件的上传和路径管理。
摘要由CSDN通过智能技术生成

访问官网:https://docs.min.io/

 

 

再当前的文件目录中输入cmd 

 

 

通过命令行启动Minio

minio server ./data

 

 启动完成后,可以看到访问的路径http://127.0.0.1:9000

使用提供的账号密码进行登录

账号:minioadmin

密码:minioadmin

 

 

 

 

 

 

 

 

 

 

 

 

http://172.16.17.121:9000/huike-crm/java.png

 

 

 

 

 

 

http://172.16.17.121:9000/huike-crm/java.png

 

现在通过一个案列与java集成  

 

代码实现:

1.先在pom.xml导入依赖,(官网获取) 

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.7</version>
</dependency>

2. 配置yml;

# Miniio配置
minio:
  endpoint: 127.0.0.1
  port: 9000
  accessKey: minioadmin
  secretKey: minioadmin
  secure: false
  bucketName: "huike-crm"    //桶名
  configDir: "/data/excel"

config:

@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;
}

 

  controller层:

/**
 * 通用请求处理
 */
@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());
        }
    }
}

service接口:

public interface ISysFileService {

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

}

service实现类:



import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.huike.clues.service.ISysFileService;
import com.huike.common.config.MinioConfig;
import com.huike.common.core.domain.AjaxResult;

import lombok.extern.slf4j.Slf4j;

@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();
		minioConfig.setBucketName("asiatrip");   
//这里想另外创建一个桶,没有将文件上传到yml配置的"huike-crm"桶里 ,也可以忽略这一步
		String bucketName = minioConfig.getBucketName();
		try {
			inputStream = file.getInputStream();

			//TODO 补全这部分代码
			/**
			 * ================================操作文件================================
			 * 思路:我们上传的文件是:合同.pdf
			 * 那么我们应该上传到配置的bucket内 我们配置的bucketName是huike-crm
			 * 那么我们存在桶里的文件应该是什么样的 也叫“合同.pdf”吗?
			 * 应该按照上传的年月日进行区分
			 * 举例:2021-05-05日进行上传的
			 * 那么存在桶里的路径应该是
			 * huike-crm/2021/05/05/这个目录下
			 * 而对于同一个文件,存在重名问题,所以我们应该利用UUID生成一个新的文件名,并拼接上 .pdf 作为文件后缀
			 * 那么完整的路径就是 huike-crm/2021/05/05/uuid.pdf
			 *
			 * 如果上述思路你无法理解,那么就直接存放在桶内生成uuid+.pdf即可
			 * 即:huike-crm/uuid.pdf
			 */
			//TODO 基于上述逻辑补全代码
			//基于官网的内容,判断文件存储的桶是否存在 如果桶不存在就创建桶
			boolean found =
					minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
			if (!found) {
				// Make a new bucket called 'asiatrip'.
				minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
			}
			//操作文件
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-");
			String date = sdf.format(new Date());
			String filename = file.getOriginalFilename();
			String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 6);
//			String fileUploadPath = date + uuid  + filename.substring(filename.lastIndexOf("."));
			String fileUploadPath = date + uuid  + filename.toString();


			//文件上传
			//由于使用的是springboot与之进行集成,上传的时候拿到的是MultipartFile 需要通过输入输出流的方式进行添加
			PutObjectArgs objuctargs=PutObjectArgs.builder().bucket(bucketName).object(fileUploadPath)
					.contentType(file.getContentType())
							.stream(file.getInputStream(),file.getSize(),-1).build();

			minioClient.putObject(objuctargs);
//			String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
//					+ fileName.substring(fileName.lastIndexOf("."));

			// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
			// 'asiatrip'.
//			minioClient.uploadObject(
//					UploadObjectArgs.builder()
//							.bucket("asiatrip")
//							.object("合同.pdf")
//							.filename("E:\\xiangmu\\项目二\\CRM 实战\\day05-勇于突破\\学员任务资料\\任务22-技术应用\\合同模板\\合同.pdf")
//							.build());
//			System.out.println(
//					"'/home/user/Photos/asiaphotos.zip' is successfully uploaded as "
//							+ "object 'asiaphotos-2015.zip' to bucket 'asiatrip'.");
			/**
			 * 构建返回结果集
			 */
			AjaxResult ajax = AjaxResult.success();
			/**
			 * 封装需要的数据进行返回
			 */
			ajax.put("fileName", "/"+bucketName+"/"+fileUploadPath);
			//url需要进行截取
			ajax.put("url", minioConfig.getEndpoint()+":"+ minioConfig
					.getPort()+"/"+ minioConfig.getBucketName()+"/"+filename);

			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;
	}
}

测试:

运行代码

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值