目录
1. 单机配置
1.1 端口放行
1.2 跟踪服务器
1.3 存储服务器
1.4 测试
1.5 文件上传(SpringBoot实现)
1. 单机配置(delron/fastdfs)
环境
阿里云服务器 CentOS 7
Docker version 20.10.12
(1)端口放行
# 如果防火墙服务打开的,需要端口放行
firewall-cmd --add-port=22122/tcp --zone=public --permanent
firewall-cmd --add-port=23000/tcp --zone=public --permanent
firewall-cmd --add-port=9001-9010/tcp --zone=public --permanent
# 重新加载
firewall-cmd --reload
# 云服务器需要将以上端口加入安全组
(2)跟踪服务器
# 拉取镜像
docker pull delron/fastdfs
# 跟踪服务器
# tracker_server=本机ip:22122 http.server.port=8080
docker run -it -d --name tracker \
-v /home/data/tracker:/var/fdfs \
-p 22122:22122 \
-p 9001:8080 \
delron/fastdfs tracker
(3)存储服务器
# the storage server port=23000
# the port of the web server on this storage server=8888
docker run -itd --name storage \
-v /home/data/fdfs/storage:/var/fdfs/ \
-e TRACKER_SERVER=120.37.100.249:22122 \
-e GROUP_NAME=group1 \
-p 23000:23000 \
-p 9002:8888 \
delron/fastdfs storage
(4)测试
docker exec -it storage /bin/bash
# 测试文件
echo "hello" > /a.txt
# 文件上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /a.txt
# 退出容器查看
exit
# /home/data/fdfs/storage为之前配置的路径,上述路径的group1/M00替换为data
cat /home/data/fdfs/storage/data/00/00/rBEABmJRpTaAEYovAAAABncc3SA653.txt
(5)文件上传(SpringBoot实现)
项目结构
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- fastdfs-spring-boot-starter -->
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
application.yml
# 应用名称
spring:
application:
name: FastDFS
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://120.37.100.249:3306/fastdfs?useSSL=false&serverTimezone=UTC
username: root
password: password
# 应用服务 WEB 访问端口
server:
port: 8080
fdfs:
connect-timeout: 10000
so-timeout: 3000
tracker-list:
- 120.37.100.249:22122
my_file.sql
# database fastdfs
drop table if exists `my_file`;
create table `my_file`
(
`id` int(8) not null auto_increment,
`fileName` varchar(50),
`groupName` varchar(50),
`filePath` varchar(50),
primary key (`id`)
);
select * from my_file;
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<strong>文件:</strong><input type="file" name="myFile"><br/><br/>
<input type="submit" value="上传">
</form>
<br/><br/>
<a href="download/1">下载第一个文件</a>
</body>
</html>
MyFile
@Data
@Alias("my_file")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class MyFile {
private Integer fileId;
private String fileName;
private String groupName;
private String filePath;
}
MyFileMapper
@Mapper
public interface MyFileMapper {
/**
* 添加文件
* @param myFile file
*/
@Insert("insert into my_file (fileName, groupName, filePath) values (#{fileName}, #{groupName}, #{filePath})")
void insert(MyFile myFile);
/**
* 根据id查询
* @param id id
* @return MyFile
*/
@Select("select * from my_file where id=#{id}")
MyFile query(Integer id);
}
UploadController
@RestController
public class UploadController {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private MyFileMapper myFileMapper;
@PostMapping("/upload")
public String upload(@RequestParam("myFile") MultipartFile myFile) throws IOException {
// 获取文件后缀名
String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
StorePath storePath = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);
MyFile uploadFile = new MyFile()
.setFileName(myFile.getOriginalFilename())
.setGroupName(storePath.getGroup())
.setFilePath(storePath.getPath());
myFileMapper.insert(uploadFile);
return storePath.getFullPath();
}
@GetMapping("/download/{id}")
public void download(@PathVariable String id, HttpServletResponse response) throws IOException {
MyFile file = myFileMapper.query(Integer.parseInt(id.trim()));
response.setHeader("Content-Disposition", "attachment; filename=" + file.getFileName());
byte[] bytes = storageClient.downloadFile(file.getGroupName(), file.getFilePath());
response.getOutputStream().write(bytes);
}
}