MinIO
ialah penyelesaian storan objek berprestasi tinggi yang menyokong penggunaan Kubernetes
secara asli. MinIO
menyediakan Amazon Web Services S3
yang serasi dengan API
dan menyokong semua fungsi S3
teras.
MinIO
Storan objek menggunakan buckets
untuk menyusun objek. Baldi adalah serupa dengan folder atau direktori dalam sistem fail, di mana setiap baldi boleh memuatkan sebarang bilangan objek. Baldi MinIO
menyediakan fungsi yang sama seperti baldi AWS S3
.
Kelebihan MinIO
ialah:
Prestasi tinggi:
MinIO
ialah perintis storan objek terkemuka di dunia, berdasarkan perkakasan standard , kelajuan baca/tulis setinggi 183 GB / 秒
dan 171 GB / 秒
.
Kebolehskalaan:
MinIO
memanfaatkan pengetahuan susah payah web
skalar untuk membawa model penskalaan storan ringkas ke storan objek , dalam MinIO
, penskalaan bermula dengan gugusan tunggal yang boleh digabungkan dengan gugusan MinIO
lain untuk mencipta ruang nama global dan merentangi berbilang pusat data yang berbeza jika perlu. Ruang nama boleh dikembangkan dengan menambahkan lebih banyak kelompok, lebih banyak rak, sehingga matlamat dicapai.
Sokongan asli awan:
MinIO
Ia adalah perisian yang dibina dari awal dalam 4 tahun yang lalu dan mematuhi semua seni bina pengkomputeran awan asli dan Proses pembinaan termasuk teknologi dan konsep baharu pengkomputeran awan terkini. Ini termasuk teknologi kontena yang menyokong Kubernetes
, perkhidmatan mikro dan penyewaan berbilang. Jadikan storan objek lebih Kubernetes
mesra.
Sumber terbuka dan sokongan peringkat perusahaan:
MinIO
Berdasarkan Apache V2 license 100%
kod sumber terbuka. Ini bermakna bahawa pelanggan MinIO
boleh secara automatik, tanpa had dan bebas menggunakan dan menyepadukan MinIO
, bebas berinovasi dan mencipta, bebas mengubah suai, dan bebas mengeluarkan semula versi dan perisian baharu, MinIO
Sangat menyokong dan memacu banyak Fortune 500 syarikat. Di samping itu, kepelbagaian dan profesionalisme penggunaannya memberikan kelebihan yang tidak dapat dipadankan oleh perisian lain.
Sila pastikan pemasangan selesai sebelum memulakan percubaan minio
:
kebergantungan dalam SpringBoot
: pom
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency>
minio
Dalam fail konfigurasi, isytiharkan maklumat : minio: url: http://192.168.40.169:9000 # minio配置的地址,端口9000,注意不是控制台的端口 accessKey: minioadmin # 账号 secretKey: minioadmin # 密码 bucketName: test-bucket # MinIO桶名字
minio
Cipta kelas konfigurasi di bawah, Cipta : @Data @Configuration @ConfigurationProperties(prefix = "minio") public class MinioConfig { /** * 服务地址 */ private String url; /** * 用户名 */ private String accessKey; /** * 密码 */ private String secretKey; /** * 存储桶名称 */ private String bucketName; @Bean public MinioClient getMinioClient() throws Exception { MinioClient minioClient = MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build(); //判断桶是否存在,不存在则新建 if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())){ minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } return minioClient; } }
MinioClient
Buat kelas alat untuk merangkum operasi biasa dalam kelas alat: @Component public class MinioTool { @Autowired private MinioClient minioClient; @Autowired private MinioConfig minioConfig; /** * 查看存储bucket是否存在 * * @param bucketName 存储bucket * @return boolean */ public Boolean bucketExists(String bucketName) { Boolean found; try { found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } catch (Exception e) { e.printStackTrace(); return false; } return found; } /** * 创建存储bucket * * @param bucketName 存储bucket名称 * @return Boolean */ public Boolean makeBucket(String bucketName) { try { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 删除存储bucket * * @param bucketName 存储bucket名称 * @return Boolean */ public Boolean removeBucket(String bucketName) { try { minioClient.removeBucket(RemoveBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 查看文件对象 * * @param bucketName 存储bucket名称 * @return 存储bucket内文件对象信息 */ public Iterable<Result<Item>> listObjects(String bucketName) { Iterable<Result<Item>> results = minioClient.listObjects( ListObjectsArgs.builder().bucket(bucketName).build()); return results; } /** * 批量删除文件对象 * * @param bucketName 存储bucket名称 * @param objects 对象名称集合 */ public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) { List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList()); Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); return results; } /** * 文件上传 * 文件名称相同会覆盖 * @param file 文件 * @return Boolean */ public Boolean upload(MultipartFile file, String fileName) { try { if (!bucketExists(minioConfig.getBucketName())) { makeBucket(minioConfig.getBucketName()); } PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName) .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build(); minioClient.putObject(objectArgs); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 文件下载 * * @param fileName 文件名称 * @param res response * @return Boolean */ public void download(String fileName, HttpServletResponse res) { GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioConfig.getBucketName()) .object(fileName).build(); try (GetObjectResponse response = minioClient.getObject(objectArgs)) { byte[] buf = new byte[1024]; int len; try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { while ((len = response.read(buf)) != -1) { os.write(buf, 0, len); } os.flush(); byte[] bytes = os.toByteArray(); res.setCharacterEncoding("utf-8"); //设置强制下载不打开 res.setContentType("application/force-download"); res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); try (ServletOutputStream stream = res.getOutputStream()) { stream.write(bytes); stream.flush(); } } } catch (Exception e) { e.printStackTrace(); } } public String getFileUrl(String fileName){ return StringFormatter.concat(minioConfig.getUrl(), "/", minioConfig.getBucketName(), "/", fileName).getValue(); } }
MinioTool
Tulis antara muka ujian untuk ujian: @Component public class MinioTool { @Autowired private MinioClient minioClient; @Autowired private MinioConfig minioConfig; /** * 查看存储bucket是否存在 * * @param bucketName 存储bucket * @return boolean */ public Boolean bucketExists(String bucketName) { Boolean found; try { found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } catch (Exception e) { e.printStackTrace(); return false; } return found; } /** * 创建存储bucket * * @param bucketName 存储bucket名称 * @return Boolean */ public Boolean makeBucket(String bucketName) { try { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 删除存储bucket * * @param bucketName 存储bucket名称 * @return Boolean */ public Boolean removeBucket(String bucketName) { try { minioClient.removeBucket(RemoveBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 查看文件对象 * * @param bucketName 存储bucket名称 * @return 存储bucket内文件对象信息 */ public Iterable<Result<Item>> listObjects(String bucketName) { Iterable<Result<Item>> results = minioClient.listObjects( ListObjectsArgs.builder().bucket(bucketName).build()); return results; } /** * 批量删除文件对象 * * @param bucketName 存储bucket名称 * @param objects 对象名称集合 */ public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) { List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList()); Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); return results; } /** * 文件上传 * 文件名称相同会覆盖 * @param file 文件 * @return Boolean */ public Boolean upload(MultipartFile file, String fileName) { try { if (!bucketExists(minioConfig.getBucketName())) { makeBucket(minioConfig.getBucketName()); } PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName) .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build(); minioClient.putObject(objectArgs); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 文件下载 * * @param fileName 文件名称 * @param res response * @return Boolean */ public void download(String fileName, HttpServletResponse res) { GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioConfig.getBucketName()) .object(fileName).build(); try (GetObjectResponse response = minioClient.getObject(objectArgs)) { byte[] buf = new byte[1024]; int len; try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { while ((len = response.read(buf)) != -1) { os.write(buf, 0, len); } os.flush(); byte[] bytes = os.toByteArray(); res.setCharacterEncoding("utf-8"); //设置强制下载不打开 res.setContentType("application/force-download"); res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); try (ServletOutputStream stream = res.getOutputStream()) { stream.write(bytes); stream.flush(); } } } catch (Exception e) { e.printStackTrace(); } } public String getFileUrl(String fileName){ return StringFormatter.concat(minioConfig.getUrl(), "/", minioConfig.getBucketName(), "/", fileName).getValue(); } }
3. Uji
Jika anda menggunakan url yang dikembalikan untuk mengakses fail secara terus, anda boleh mendapati bahawa pulangan kebenaran tidak mencukupi:
Di sini anda perlu menukar
lalai ialah Bucket
dan boleh ditukar kepada Access Policy
tanpa pengesahan, tetapi keselamatan tidak boleh dijamin: private
public
Akses sekali lagi dan fail boleh dibuka:
Jika anda perlu menyimpan
, anda boleh memuat turunnya melalui dan menggunakan antara muka ujian private
untuk memuat turun fail: MinioClient
download
http://localhost:8080/file/download/20cab4e3979eba6003f95aca0dc75c63.jpg
Atas ialah kandungan terperinci Bagaimana SpringBoot menggunakan Minio untuk penyimpanan fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!