当前位置: 首页 > news >正文

java使用MinIO,虚拟机时间异常

使用docker进行环境部署和启动

docker pull minio/miniodocker run -d -p 9000:9000 -p 9001:9001 \-e "MINIO_ROOT_USER=minio" \-e "MINIO_ROOT_PASSWORD=minio123" \-v /opt/minio/data:/data \-v /opt/minio/config:/root/.minio \minio/minio server --console-address ":9001" /data

部署自带管理界面 访问 http://192.168.85.143:9000 Access Key为minio Secret_key为minio123 进入系统后可以看到主界面 创建一个桶 添加名称 上传完成后可以通过地址+桶名+文件名访问

项目集成MinIO

添加依赖

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

配置读取类

@Data
@ConfigurationProperties(prefix = "minio")
public class MinIOProperties {private String endpoint;//minio地址private String accessKey;//用户名private String secretKey;//密码private String bucketName;//桶名
}

添加配置

spring:servlet:multipart:max-file-size: 20MBmax-request-size: 21MBminio:endpoint: http://192.168.85.143:9000 #minio地址accessKey: minio #用户名secretKey: minio123 #密码bucketName: nini #桶名

配置类

@Configuration
@EnableConfigurationProperties(MinIOProperties.class)
public class MinIOConfig {@Beanpublic MinioClient minioClient(MinIOProperties minIOProperties){MinioClient minioClient = new MinioClient(minIOProperties.getEndpoint(), minIOProperties.getAccessKey(), minIOProperties.getSecretKey());return minioClient;}
}

模板类

@Component
public class MinIOTemplate {@Autowiredprivate MinioClient minioClient;@Autowiredprivate MinIOProperties properties;/*** 上传文件* @param file* @return*/public String upload(MultipartFile file) {// 原文件名String originalFilename = file.getOriginalFilename();// 获取文件的后缀String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// 构造新的文件名,名字不重复String objectName = UUID.randomUUID().toString() + suffix;// 上传文件try {PutObjectArgs putObjectArgs = PutObjectArgs.builder().contentType(file.getContentType()).stream(file.getInputStream(), file.getSize(), -1).bucket(properties.getBucketName()).object(objectName).build();minioClient.putObject(putObjectArgs);} catch (Exception e) {throw new RuntimeException("上传文件失败: " + e.getMessage());}return properties.getEndpoint() + "/" + properties.getBucketName() + "/" + objectName;}/*** 上传文件* @param name* @param inputStream* @param contentType* @return*/public String upload(String name, InputStream inputStream, String contentType){// 上传文件try {PutObjectArgs putObjectArgs = PutObjectArgs.builder().contentType(contentType).stream(inputStream, inputStream.available(), -1).bucket(properties.getBucketName()).object(name).build();minioClient.putObject(putObjectArgs);} catch (Exception e) {throw new RuntimeException("上传文件失败: " + e.getMessage());}return properties.getEndpoint() + "/" + properties.getBucketName() + "/" + name;}/*** 删除文件* @param url*/public void delete(String url){String objectName = url.replace(properties.getEndpoint()+"/","").replace(properties.getBucketName()+"/","");RemoveObjectArgs args = RemoveObjectArgs.builder().bucket(properties.getBucketName()).object(objectName).build();try {minioClient.removeObject(args);} catch (Exception e) {throw new RuntimeException("删除文件失败: " + e.getMessage());}}/*** 下载文件* @param url* @return*/public InputStream download(String url){String objectName = url.replace(properties.getEndpoint()+"/","").replace(properties.getBucketName()+"/","");GetObjectArgs args = GetObjectArgs.builder().bucket(properties.getBucketName()).object(objectName).build();InputStream inputStream = null;try {inputStream = minioClient.getObject(args);} catch (Exception e) {throw new RuntimeException("下载文件失败: " + e.getMessage());}return inputStream;}
}

上传文件失败报错

如果报以下错误:The difference between the request time and the server's time is too large.

原因是:linux服务器时区的问题(因为虚拟机挂起后,时间也就停了)

解决方案:进行时间同步

1、查看系统时间、硬件时间

date // 查看系统时间
hwclock // 查看硬件时间

2、 安装ntpdate工具

yum -y install ntp ntpdate

3、 设置系统时间与网络时间同步

ntpdate cn.pool.ntp.org

4、将系统时间写入硬件时间

hwclock --systohc

相关文章:

  • Typora安装使用教程,图片相对储存路径路径设置
  • 滚珠导轨:电子制造领域精密运动的核心支撑
  • 跨线程和跨进程通信还有多种方式对比
  • 大模型(LLMs)agent
  • C++之“继承”
  • 年龄估计数据集
  • 深入探索 JavaScript 中的模块对象
  • 面试问题(连载。。。。)
  • 最优化方法Python计算:有约束优化应用——线性Lasso回归预测器
  • LeetCode算法题(Go语言实现)_62
  • 使用JAVA对接Deepseek API实现首次访问和提问
  • 【MySQL】第二弹——MySQL表的增删改查(CRUD)
  • 【Linux】module list的用法
  • 流批了,低调使用
  • 使用Hyper-V 安装Windows11操作系统
  • 初学python的我开始Leetcode题8-4
  • 图形移动处理
  • 高效C/C++之九:Coverity修复问题:关于数组操作 和 内存操作
  • Google 发布 Gemini 2.5 Pro Preview (I/O Edition),具有增强的编程能力
  • Java三大基本特征之多态
  • 四川资阳市原市长王善平被双开,“笃信风水,大搞迷信活动”
  • “80后”赵亮出任上海普陀区委副书记
  • 人民日报评“组团退演出服”:市场经济诚信原则需全社会维护
  • 人民时评:透过上海车展读懂三组密码
  • 国家主席习近平同普京总统举行大范围会谈
  • “20后”比“60后”更容易遭遇极端气候事件