FastDFS概念
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS概念图
在Linux虚拟机docker容器上面下载FastDFS Linux操作:
docker pull season/fastdfs
启动tracker容器
默认端口为:22122
docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
提示:一定要关防火墙
vi /etc/sysconfig/selinux
进入之后修改SELINUX的值
SELINUX=disabled
然后重启:
reboot
启动storager容器
docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.119.132:22122 season/fastdfs storage
进入storager容器 修改注册中心ip
吧文件cp到本地根目录下修改
docker cp storage:/fdfs_conf/storage.conf ~/
然后再cp到storage:/fdfs_conf/目录下
开一个客户端 敲运行命令
docker run -ti --name fdfs_sh --net=host season/fastdfs sh
测试文件上传
查看/usr/bin下的所有fdfs工具
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
上传路径为
group1/M00/00/00/wKh3hFwGc7-AH5ShAAAAB6Dv-8U004.txt
代码实现
依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
如果没有fastdfs-spring-boot-starter这个依赖加sonatype私服
<repositories>
<repository>
<id>sn</id>
<name>sn</name>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
</repository>
</repositories>
配置文件
server:
port: 8899//端口
fdfs:
connect-timeout: 10000 //最大连接超时
so-timeout: 3000 //最大响应超时
tracker-list:
- 192.168.119.132:22122 //Tracker服务器端口
spring:
datasource:
url: jdbc:mysql://localhost/tang //数据库url
password: ps123456 //数据库用户密码
username: root //数据库用户
driver-class-name: com.mysql.jdbc.Driver//驱动程序类名
http:
multipart:
max-file-size: 10485760 //上传最大文件大小
代码实现
@RestController
public class UploadController {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
JdbcTemplate jdbcTemplate;
/**
*
* @param myFile
* 是从浏览器提交过来的
* @return
* @throws IOException
*/
@PostMapping("fupload")//上传文件
public String upload(@RequestParam("myFile1") MultipartFile myFile) throws IOException {
String extName= FilenameUtils.getExtension(myFile.getOriginalFilename());
StorePath storePath = storageClient.uploadFile("group1",myFile.getInputStream(),myFile.getSize(),extName);
String sql="insert into myflie(filename,qroupName,filepath) values(?,?,?)";
jdbcTemplate.update(sql,myFile.getOriginalFilename(),storePath.getGroup(),storePath.getPath());
return storePath.getFullPath();
}
@GetMapping("/fdownload/{id}")//下载文件
public void download(@PathVariable String id, HttpServletResponse httpServletResponse) throws IOException {
List query = jdbcTemplate.query("select * from myflie where fileid="+id, new ColumnMapRowMapper());
Map map= (Map) query.get(0);
String filrName=map.get("filename").toString();
String groupName=map.get("qroupName").toString();
String filePath=map.get("filepath").toString();
httpServletResponse.setHeader("Content-Disposition","attachment; filename="+filrName+"");
byte[] bytes = storageClient.downloadFile(groupName, filePath);
httpServletResponse.getOutputStream().write(bytes);
}
}