首页 > 其他分享 >使用minio进行文件存储

使用minio进行文件存储

时间:2023-05-26 17:44:05浏览次数:70  
标签:文件 存储 java minio bucket io import String

一. Docker拉取镜像(确保自己的服务器已经安装Docker)

docker pull minio/minio

二. 启动一个miniio容器

docker run --name minio -p 9090:9000 -p 9999:9999 -d \
--restart=always -e \
"MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio minio/minio server /data --console-address '0.0.0.0:9999'

账号是minio; 密码是minio123

三. 访问minio管理界面

端口9090或9999(确保在服务器放行相关端口即可访问)

 

点击 create a Bucket 创建一个bucket(桶), 这里的Bucket 我们可以理解为文件存储的目录

输入 bucket name ,点击create bucket 。可以通过 upload 上传文件到bucket中。

四. Java 上传文件到minio

  1. 导入依赖

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

        2.测试类(需要输入自己的账号密码和IP)

import io.minio.MinioClient;
import io.minio.ObjectWriteResponse;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author lqs
 * @date 2022/11/18 9:53
 */
public class MinioTest {
    public static void main(String[] args) throws Exception {
        try {

            // 构建一个Minio客户端
            MinioClient minioClient = MinioClient.builder()
                    //创建容器时指定的账号
                    .credentials("账号", "密码")
                    //上传地址
                    .endpoint("http://IP:9090").build();

            File file = new File("C:\\Users\\coderyeah\\Desktop\\welt.jpg");

            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object("welt.jpg")    //文件名
                    .contentType("image/jpeg")    //文件类型
                    .bucket("bucket-test")  //存储目录名
                    .stream(new FileInputStream(file), file.length(), -1).build(); //文件流,以及大小,-1代表不分片

            //执行上传
            ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs);
            System.out.println("上传结果 " + objectWriteResponse);
            //上传之后的文件地址是:
            String filePath = "http://IP:9090/bucket-test/welt.jpg";
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    }
}
package com.test.FileUploadUtils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.MinioException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;


/**
 * 文件上传到minio服务器
 *
 * @author doubleflower
 * @date 2023-05-25
 */
@Service
@Slf4j
public class FileUploadUtils {

    @Resource
    private Sms2Config sms2Config;

    @Value("${sign.key}")
    private String signKey;

    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.port}")
    private String port;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Value("${minio.bucketName}")
    private String bucketName;


    /**
     * 文件上传
     *
     * @param multipartFile
     * @return
     */
    @Override
    public String upload(MultipartFile multipartFile) throws IOException {
        String fileUrl = null;
        InputStream inputStream = null;
        File file = null;
        try {
            // 创建临时文件
            file = File.createTempFile("temp", null);
            // 把multipartFile写入临时文件
            multipartFile.transferTo(file);
            // 使用文件创建 inputStream 流
            inputStream = new FileInputStream(file);
            // 构建一个Minio客户端
            MinioClient minioClient = MinioClient.builder()
                    //创建容器时指定的账号
                    .credentials(accessKey, secretKey)
                    //上传地址
                    .endpoint(endpoint + ":" + port).build();
            String fileName = multipartFile.getOriginalFilename();
            String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));
// 获取文件类型
String contentType=multipartFile.getContentType(); PutObjectArgs putObjectArgs = PutObjectArgs.builder() .object(objectName) .contentType(contentType) .bucket(bucketName) .stream(inputStream, file.length(), -1).build(); //执行上传 minioClient.putObject(putObjectArgs); //上传之后的文件地址是: fileUrl = endpoint + ":" + port + "/" + bucketName + "/" + objectName; } catch (MinioException e) { System.out.println("Error occurred: " + e); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } finally { // 最后记得删除文件 file.deleteOnExit(); // 关闭流 inputStream.close(); } return fileUrl; } }

五. 配置权限

如果我们需要我们上传的文件可以被匿名用户访问,那么需要添加访问权限:找到文件存储目录,点击manager

 然后找到access Rules添加访问规则如下:

 然后再访问路径:http://IP:PORT/bucket-test/welt.jpg

标签:文件,存储,java,minio,bucket,io,import,String
From: https://www.cnblogs.com/doubleflower/p/17435417.html

相关文章

  • Java大文件分片上传/多线程上传实例解析
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1. 通过form表单向后端发送请求         <formid="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="pos......
  • 导出Excel,下载文件,返回文件流和报错信息处理
    downloadExcelCreateA(resData,fileName){//下载文件varblob=newBlob([resData],{type:'application/vnd.ms-excel'})vardownloadElement=document.createElement('a');varhref=window.URL.creat......
  • C++文件流结构体序列化,并查集,LRU缓存
    c语言中的文件操作中用fprintf将数据写入到文件中,用fscanf将文件读入内存中,而c++中也有ostream和istream作为键盘流输入,屏幕流输出,对于文件也有ofstream/istream来进行相关的操作.如图:图中表示将一个结构体的的数据输入到文件中,并从文件中读取数据,并用得到的数据初始化一......
  • 文件句柄(File Handle)
     文件句柄(FileHandle)是操作系统中用于访问文件的一种数据结构,通常是一个整数或指针。文件句柄用于标识打开的文件,每个打开的文件都有一个唯一的文件句柄。在Linux和Unix系统中,文件句柄是通过调用open()系统调用打开文件时返回的。当打开一个文件时,操作系统会为该文件分......
  • springboot添加多个环境的配置文件
    1,在resources目录下面新建application.properties,application-dev.properties,application-pre.properties,application-prod.properties2,在application.properties只添加一行要激活的环境,其他不用添加spring.profiles.active=dev3,其他属性文件根据需要配置不同的属性......
  • 前端vue中实现文件下载的几种方法 四种方法, a.download = "重新下命名下载文件名"
    前端vue中实现文件下载的几种方法原文链接:https://blog.csdn.net/weixin_46074961/article/details/105677732第一种前端创建超链接,通过a标签向后端发送get请求,需要给a标签添加一个download属性这种写法是创造了一个a标签,把地址写到a标签里再用js调用点击,实现访问文件地址......
  • EasyDSS如何调用接口获取录像MP4文件合成状态?
    EasyDSS互联网视频云服务的视频直播/点播功能支持视频采集、编辑、上传、媒体资源管理、自动化转码处理、分发服务等,帮助用户快速搭建拥有极致观看体验、安全可靠的视频直播点播应用。有用户反馈在调用接口时,会出现合成中的字样,并不知道合成的录像MP4文件是否已经合成完毕。今天我......
  • 数据库 视图、触发器、存储过程
    数据库视图、触发器、存储过程一直以来总是CRUD,只会操作数据库表了,其他的视图、触发器、存储过程忘完了,但因为生产事故被迫研究了一下,简单回顾一下概念吧。视图在看系统的权限管理部分时,发现它是从视图中查询数据的,通过将多个权限表的数据关联为视图,大大减少了查询时的SQL......
  • MAUI Android 关联文件类型
    实现效果打开某个文件,后缀是自己想要的类型,在弹出的窗口(用其它应用打开)的列表中显示自己的应用图标点击后可以获得文件信息以便于后续的操作实现步骤以注册.bin后缀为例,新建一个MAUI项目调整启动模式修改Platforms\Android\MainActivity.cs[Activity(Theme="@style......
  • Python:简单的文件备份脚本
    文件备份脚本,实现了按照日期归类,时间建备份文件的功能,还能加入用户的备注信息。#!/usr/bin/python#Filename:backup_ver3.pyimportosimporttime#1.sourcefilewhichtobebackedup.source=['/home/shibo/Code']#2.targetpathwhicharebackedupto.target_dir......