拉取fastfds镜像
docker pull delron/fastdfs
1.创建tracker容器
启动,默认端口是22122
#最后一个tracter是传的参数,表示该容器是tracker,可以传tracker或storage
#--network=host 表示使用宿主机的端口,也就是宿主机使用22122端口,容器就不能再使用22122端口,不写这个表示用bridge,bridge宿主机和容器端口不冲突
docker run -d --network=host --name=tracker -v /mydata/fdfs/tracker:/var/fdfs delron/fastdfs tracker
如果linux磁盘过小,可以修改tracker配置文件,减少磁盘剩余空间限制,开启上传能力
docker exec -it tracker bash
cd /etc/fdfs
vi tracker.conf
#只要修改一个参数,比如reserved_storage_space = 10K
### G or g for gigabyte(GB)
### M or m for megabyte(MB)
### K or k for kilobyte(KB)
### no unit for byte(B)
### XX.XX% as ratio such as reserved_storage_space = 10%
reserved_storage_space = 10%
#然后退出容器,先停掉容器,docker stop id,然后删除rm -rf /mydate/fdfs/tracker/*,最后启动容器docker start id
2.创建storage容器
docker run -d --network=host --name=storage -e TRACKER_SERVER=xx.xx.xx.xx:22122 -v /mydata/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
第一次启动是成功的,如果希望重新启动,必须要先删除/mydata/fdfs/xxx/data/fdfs_xxx.pid,然后在启动,否则查看日志会报错
编写shell脚本 vi start_fdfs.sh
rm -rf /mydata/fdfs/tracker/data/*.pid
rm -rf /mydata/fdfs/storage/data/*.pid
docker start tracker
docker start storage
ls -l|grep start_fdfs.sh
默认是没有执行权限的
-rw-r–r-- 1 root root 120 4月 9 23:14 start_fdfs.sh
授权 chmod 775 start_fdfs.sh
-rwxr-xr-x 1 root root 120 4月 9 23:14 start_fdfs.sh
执行 sh start_fdfs.sh
以上都执行完毕后,开始编写代码
3.代码部分
导入依赖
<!--fastdfs依赖-->
<dependency>
<groupId>cn.bestwu</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27</version>
</dependency>
添加application.yml文件
#设置可上传文件的大小
spring:
servlet:
multipart:
max-file-size: 100MB #一个上传文件最大容量。默认1M
max-request-size: 500MB #一次请求最大容量。默认10M
在resources目录下新建配置文件fdfs.properties
fastdfs.connect_timeout_in_seconds=10
fastdfs.network_timeout_in_seconds=30
和跟踪器配置文件/etc/fdfs/tracker.conf中的http.server_port一致
fastdfs.http_tracker_http_port=8080
#如果跟踪器是集群,用逗号分割
fastdfs.tracker_servers=xx.xx.xx.xx:22122
fastdfs.charset=UTF-8
fastdfs工具类
package com.gzs.upload.utils;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author GZS
* @date 2022年04月09日
*/
public class FastDFSUtils {
//初始化客户端对象
//存储器客户端对象。文件上传下载,是保存在存储器中的。
private final static StorageClient storageClient;
static {
try {
//给GlobalClient类型中的静态属性g_tracker_group赋值
//加载配置文件
// InputStream inputStream = FastDFSUtils.class.getClassLoader()
// .getResourceAsStream("fdfs.properties");
// Properties properties = new Properties();
// properties.load(inputStream);
ClientGlobal.initByProperties("fdfs.properties");
//找跟踪器
//跟踪器客户端
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
storageClient = new StorageClient(trackerServer,storageServer);
} catch (Exception e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
/**
* 上传文件到fastdfs
* @param inputStream
* @param originalFileName 文件上传原始名
* @return
*/
public static String[] upload(InputStream inputStream,String originalFileName){
try {
// 获取文件大小
int size = inputStream.available();
byte[] tmp = new byte[size];
//读取文件q全部内容到字节数组
inputStream.read(tmp,0,size);
// 准备文件元数据
NameValuePair[] nameValuePairs = new NameValuePair[]{
new NameValuePair("fileName",originalFileName),
new NameValuePair("size",size+""),
new NameValuePair("createTime",System.currentTimeMillis()+"")
};
// 上传文件,返回一个字符串,长度是2。
// 0下标是存储器的卷名
// 1下标是存储器自动生成的文件名(包括文件夹)
String[] result = storageClient.upload_file(tmp, originalFileName.substring(originalFileName.lastIndexOf(".")+1), nameValuePairs);
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
实现类impl
@Override
public boolean uploadFile(MultipartFile file) {
try {
String[] result = FastDFSUtils.upload(file.getInputStream(),
file.getOriginalFilename());
if (result == null){
return false;
}
//打印结果 [group1, M00/00/00/rB-Q-GJRuKSAV8wxAAAqlvhD1VI241.txt]
//M00,代表的你所存放的目录,/00/00代表00目录下的00目录
System.out.println(Arrays.toString(result));
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}