fastdfs概念图
fastdfs操作顺序
fastdfs 安装
//查询:
docker search fastdfs
//下载:
docker pull season/fastdfs
// 本机方式启动注册中心tracker:
docker run -itd --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
默认启动22122端口
// 禁用防火墙:
vi /etc/sysconfig/selinux
//重启虚拟机:
reboot
防火墙禁用方法
启动仓库storage
docker run -itd --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:
/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.1.2:22122 season/fastdfs storage
进入容器
//进入容器:
docker exec -it storage bash
//查看配置:
more storage.conf
//复制出来,修改配置再考回去
docker cp storage.conf:/fdfs_conf ~/
//考回去
docker cp ./storage.conf storage:/fdfs_conf/
//因为docker是精简版的系统,所以修改配置需要拷贝出来改好再复制回去
将ip修改为Linux系统Ip
重启storage:docker stop storage → docker start storage
再次进入storage容器 docker exec -it storage bash
确认配置是否修改成功
下图箭头为组名,默认group1,依次往上加,有组号说明tracker已启动
fdfs_monitor fdfs_conf/storage.conf
》》测试文件上传
查看/usr/bin下的所有fdfs工具
[root@bogon fdfs]# ls /usr/bin | grep 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 //上传文件
启动客户端
//启动容器
docker run -itd --name fdfs_sh --net=host season/fastdfs sh
//进入容器
docker exec -it sh bash
//创建文件赋值
a.txt: echo dajiahao>a.txt
//进入目录
root@localhost:/# cd fdfs_conf
//上传文件
root@localhost:/fdfs_conf# fdfs_upload_file storage.conf /a.txt
//上传成功 返回的地址
group1/M00/00/00/wKiuglwGoJWARxYvAAAACZLaVGU072.txt
//组名/地址/保证安全的随机名字.后缀名
命令下载
下载文件到本地(fdfs_download_file <config_file> <file_id> [local_filename])
[root@bogon 00]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKiuglwGoJWARxYvAAAACZLaVGU072.txt ~/a.txt
[root@bogon 00]# ll ~
total 168836
-rw-------. 1 root root 2913 Apr 5 2016 anaconda-ks.cfg
-rw-r--r-- 1 root root 13 Sep 7 20:35 a.txt
-rw-r--r-- 1 root root 13 Sep 7 20:46 bb.tx
删除文件(fdfs_delete_file <config_file> <file_id>)
[root@bogon 00]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiuglwGoJWARxYvAAAACZLaVGU072.txt
#删除了该文件 还可以查看到它的信息
[root@bogon 00]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKiuglwGoJWARxYvAAAACZLaVGU072.txt
source storage id: 0
source ip address: 192.168.58.146
file create timestamp: 2017-09-07 20:37:19
file size: 13
file crc32: 2430562586 (0x90DF711A)
#再次尝试删除 发现报错文件不存在
[root@bogon 00]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKiuglwGoJWARxYvAAAACZLaVGU072.txt
[2017-09-07 20:48:23] ERROR - file: tracker_proto.c, line: 48, server: 192.168.58.146:23000, response status 2 != 0
delete file fail, error no: 2, error info: No such file or directory
java代码 上传下载:
pom文件
<dependencies>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
controller层
package cn.ps.controll;
@RestController
public class UploadControll {
@Autowired
JdbcTemplate jt;
@Autowired
FastFileStorageClient ffsc;
@PostMapping("/up") //上传文件
public String upload(@RequestParam MultipartFile myfile) throws IOException {
String extname = FilenameUtils.getExtension(myfile.getOriginalFilename());
StorePath group1 = ffsc.uploadFile("group1",myfile.getInputStream(), myfile.getSize(),extname);
String sql="insert into filenametable (filename,groupname,filepath) values (?,?,?)";
jt.update(sql,myfile.getOriginalFilename(),group1.getGroup(),group1.getPath());
return group1.getFullPath();
}
//下载文件
@Autowired
FastFileStorageClient storageClient;
@GetMapping("/down/{fileid}")
public void download(@PathVariable String fileid, HttpServletResponse resp) throws IOException {
List query = jt.query("select * from filenametable where fileid="+fileid ,new ColumnMapRowMapper() );
Map map=(Map)query.get(0);
String filename = URLEncoder.encode(map.get("filename").toString(),"UTF-8");
String groupname = map.get("groupname").toString();
String filepath =map.get("filepath").toString();
resp.setHeader("Content-Disposition","attachment;filename="+filename);
byte [] byt=storageClient.downloadFile(groupname,filepath);
resp.getOutputStream().write(byt);
}
}
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="up">
文件:<input type="file" name="myfile" >
<input type="submit" value="上传">
</form>
<a href="down/1">下载</a>
</body>
</html>
配置文件application.yml
fdfs:
connect-timeout: 10000 # 连接超时时间
so-timeout: 5000 # 响应超时时间
tracker-list:
- 192.168.174.130:22122 #linux系统 docker运行地址
server:
port: 8899 # window 端口
spring:
datasource: # 数据库连接
url: jdbc:mysql://192.168.0.250/school
password: ps123456
username: root
driver-class-name: com.mysql.jdbc.Driver
http:
multipart:
max-file-size: 10485760 # 内存大小,单位byte
返回数组 返回两个参数 第一个是存储的组名 第二是 图片的路径
组名/地址/随机名/后缀名
group1/M00/00/00/wKiuglwGsX-Aa62AAACf_PEcWVI803.png