网站内文件存储-快速入门

1
2
3
4
5
6
作者: 夜泊1990
企鹅: 1611756908
Q 群: 948233848
邮箱: hd1611756908@163.com
博客: https://hs-an-yue.github.io/
B 站: https://space.bilibili.com/514155929/

第一章 什么是文件存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在网络上存在各种各样的资源
1. 文本资源 .txt .html 用户信息(用户名、密码、性别、年龄...)
2. 多媒体资源
2.1 Excel、Word、PPT、PDF等
2.2 音频(mp3 ...)
2.3 视频(mp4 ...)
2.4 图片

以上这些数据按照分类需要保存到不同的数据库中
1. 数据库
1.1 关系型数据库
1.2 非关系型数据库
1.3 向量数据库
...
2. 文件服务器(存储大文件)
...

第二章 文件存储的实现方式

第1节 方式一 基于SpringBoot应用存储

1
2
3
如果项目较小,存储的文件不是很多,并且多以图片或者小的文本文件为主,并且不涉及到敏感图片,这是可以采用方式一,简单方便。

实现方式非常简单,步骤如下 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓

第1步 创建一个基于Springboot的Web项目

第2步 配置SpringBoot的静态资源管理

1
2
3
4
spring:
web:
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:d:/file/

第3步 测试

1
按照第2步 在d盘(可以设置本地硬盘的任意位置)创建一个file文件夹,并且在此文件夹中放一张图片用于测试,如下所以:

第4步 启动项目并测试

1
2
1. 启动项目
2. 在浏览器中输入 服务器地址+文件名 例如:

第5步 测试完成后,编写API将文件操作接口暴露给用户使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//1. 设计数据库表
-- 创建库
CREATE DATABASE db_file DEFAULT CHARACTER SET utf8;
-- 文件表
CREATE TABLE sys_file(
file_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '文件ID,主键自增',
file_name VARCHAR(255) NOT NULL COMMENT '文件名称',
file_url VARCHAR(255) NOT NULL COMMENT '文件服务器地址',
file_address VARCHAR(255) NOT NULL COMMENT '文件本地硬盘的真实地址',
suffix VARCHAR(100) COMMENT '文件格式 pdf xlsx zip ppt docx等',
size BIGINT DEFAULT 0 COMMENT '文件大小',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '设置当前时间,并且自动更更新时间'
)DEFAULT CHARSET='UTF8' AUTO_INCREMENT=1000 COMMENT='文件表';
//2. 其它操作略

第2节 方式二 基于minio文件服务器存储

第1步 minio官网

1
https://www.minio.org.cn/

第2步 minio安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
本练习通过Docker容器化平台进行minio的安装: minio支持PodmanDocker两种方式,我这里采用Docker方式
安装地址: https://www.minio.org.cn/docs/minio/container/index.html

第一步: 创建数据库的保存目录 命令为: mkdir -p ~/minio/data
第二步: 运行docker命令,命令如下: (注意:需要自己安装Docker平台)
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-d --restart=always \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio123" \
quay.io/minio/minio server /data --console-address ":9001"
第三步: 访问和测试
1. 访问地址: http://192.168.206.129:9001/
2. 用户名和而密码: minio/minio123 在进行第一次启动时设置用户名和密码(用户名长度至少5位,密码至少8位)
3. 登录上去后进入minio控制台页面

第3步 minio的API操作(Java版)

Maven依赖

1
2
3
4
5
6
<!-- 依赖 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.12</version>
</dependency>

功能介绍

1
2
1. 文件上传
2. 文件删除

集成SpringBoot对外提供API接口案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
第一步: 在minio操作页面创建一个用户(给读写权限),并且在创建accessKey和securityKey
第二步: 创建SpringBoot项目添加minio依赖
第三步: 在SpringBoot配置minio服务器 application.yml
minio:
# minio账户的access
access_key: s9Aev3pEpCqKaaoMuanY
# minio账户的security
security_key: mvsXMUYHq44GQkZERtbzzspYu1iULIvGsZynwC80
# 服务器地址
endpoint: http://192.168.206.129:9000/
# 创建桶,用来装文件(可以在minio页面创建,并且分配权限,默认私有)
bucketName: test
第四步: 创建minio客户端

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.access_key}")
private String accessKey;
@Value("${minio.security_key}")
private String secretKey;
@Bean
public MinioClient createMinioClient() {
return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
}
}

第五步: 上传和删除代码实现
@Resource
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
@Value("${minio.endpoint}")
private String endpoint;

/**
* 删除文件
*/
@PostMapping(value = "/deleteFile")
public Object deleteFile(String fileName) throws Exception {
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.build());
return Map.of("code","0","msg","删除成功");
}

/**
* 上传文件
*/
@PostMapping(value = "/uploadFile")
public Object uploadFile(MultipartFile file) throws Exception {
//创建桶
createBucket(minioClient,bucketName);
try {
//文件上传
minioClient.putObject(PutObjectArgs.builder().
bucket(bucketName)
.object(file.getOriginalFilename())
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build());
return Map.of("code",0,"msg","success","data",endpoint+bucketName+"/"+file.getOriginalFilename());
}catch (Exception e) {
e.printStackTrace();
}
return Map.of("code",0,"msg","success");
}

/**
* 创建桶
* @param minioClient minio客户端
* @param bucketName 桶名字
* @throws Exception 异常
*/
public void createBucket(MinioClient minioClient, String bucketName) throws Exception {
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
} else {
System.out.println("Bucket " + bucketName + " already exists.");
}
}

已完成…

--------------------------已经到底啦!--------------------------