fastDFS的安装和springboot完成文件上传

fastDFS的安装和springboot完成文件上传

1. 安装fastDFS

  1. 安装libevent

ubuntu下

1
sudo apt-get install libevent-dev

centos下

1
yum -y install libevent

  1. 如果没有gcc(gcc -v没有打印版本)那么要安装gcc
1
2
sudo apt install gcc
sudo apt install build-essential

centos使用yum install


  1. 如果没有unzip要安装unzip

ubuntu下

1
sudo apt install unzip

centos下

1
yum install -y unzip zip

  1. 安装libfastcommon-master
1
2
3
4
unzip libfastcommon-master.zip
cd libfastcommon-master
./make.sh
./make.sh install

  1. 回到压缩包的目录,开始安装fastdfs
1
2
3
4
tar -zxvf FastDFS_v5.08.tar.gz
cd FastDFS
./make.sh
./make.sh install

  1. 检验是否安装成功

输入下面命令有fdfs_trackerdfdfs_storaged两条记录显示就成功

1
ll /etc/init.d/ | grep fdfs

查看是否有3个模板

1
ll /etc/fdfs/
  • tarcker.conf.sample 是tracker的配置文件模板
  • storage.conf.sample 是storage的配置文件模板
  • client.conf.sample 是客户端的配置文件模板

  1. 配置并启动

先看tracker,storage同理

1
2
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vim /etc/fdfs/tracker.conf

修改base_path为你想要存放的路径(我这里是/home/wjw/fastdfs/tracker)

1
base_path=/home/wjw/fastdfs/tracker

自己建立好这个文件夹


storage同理

1
2
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vim /etc/fdfs/storage.conf

修改的内容如下

1
2
3
4
5
base_path=/home/wjw/fastdfs/storage                 # 数据和日志文件存储根目录 

store_path0=/home/wjw/fastdfs/storage # 第一个存储目录

tracker_server=192.168.72.128:22122 # tracker服务器IP和端口

自己建立好这个文件夹


开启服务

ubuntu

1
2
fdfs_trackerd /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start

centos

1
2
service fdfs_trackerd start
service fdfs_storaged start

  1. 如果开启服务报错可以试试先关闭防火墙再开启服务

ubuntu

1
sudo ufw disable

centos

1
chkconfig iptables off

  1. 检查是否启动成功:
1
ps -ef | grep fdfs

N7YWdI.png


  1. 设置服务开机自启动:

ubuntu比较复杂,尤其是对于安装了图形桌面版,一登陆默认是非root

下面给出最标准的解决方案

1
vi /lib/systemd/system/rc.local.service

修改结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

#自己添加这一段
[Install]
WantedBy=multi-user.target
Alias=rc-local.service

退出vi后执行

1
ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/rc.local.service

编辑这个(可能原来是空的,没关系)

1
vi /etc/rc.local

大胆复制粘贴

1
2
3
4
#!/bin/bash
fdfs_trackerd /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start
exit 0

编辑完成退出vi后添加权限

1
sudo chmod +x /etc/rc.local

可以了


centos比较简单

1
2
chkconfig fdfs_trackerd on
chkconfig fdfs_storaged on

2. 安装fastdfs-nginx模块

  1. 解压之前从网盘下载的这个文件,进入,编辑配置文件
1
2
3
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/src/
vim config
  1. 使用替换命令(不需要进入插入模式,直接复制粘贴回车一气呵成)
1
:%s+/usr/local/+/usr/+g
  1. 设置关联,把当前文件夹下的mod_fastdfs.conf文件复制到/etc/fdfs/
1
cp mod_fastdfs.conf /etc/fdfs/
1
vi /etc/fdfs/mod_fastdfs.conf

修改结果

1
2
3
4
5
6
7
connect_timeout=20                       # 客户端访问文件连接超时时长(单位:秒)

tracker_server=192.168.72.128:22122 # tracker服务IP和端口

url_have_group_name=true # 访问链接前缀加上组名

store_path0=/home/wjw/fastdfs/storage # 文件存储路径

回到网盘下载好那几个压缩包的目录(只能这么描述了,你们放在哪里自己清楚),进入FastDFS文件夹的conf文件夹

1
2
cd FastFDS/conf/
cp http.conf mime.types /etc/fdfs/

3. 安装nginx并绑定fastdfs的nginx模块

我这里已经安装过nginx了,如果没有的话我建议手动下载gzip安装而不是apt安装,因为后期要添加模块的话只能修改完模块后重新make,而apt安装就不可以做到(像我一样apt安装的就很麻烦,不仅目录乱而且还是要下载gz包添加模块)

我随便找个教程吧(百度第一个,我没试过)

https://blog.csdn.net/qq_23832313/article/details/83578836

而我的目录非常混乱,当事人非常后悔:

  • /usr/bin 启动文件
  • /opt/nginx 配置文件
  • /usr/local 安装文件(原始的配置文件,不要动它)

使用命令可以查看是否安装好nginx

1
nginx -v

不管是否已经安装好,想添加模块都需要在下载好的nginx目录下执行要添加的模块,然后重新make(add-module后面是第二步解压好的fastdfs-nginx-module那个路径),大家要注意改成自己的目录

1
./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/home/wjw/Desktop/fastfds/fastdfs-nginx-module/src/
1
make

备份

1
mv /usr/bin/nginx /usr/bin/nginx-bak

替换原本的nginx启动文件,注意改成自己的目录

1
cp objs/nginx /usr/bin/

修改配置文件,注意改成自己的目录

1
vim  /opt/nginx/conf/nginx.conf

将原来的监听80端口改成如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;
server_name image.upload.com;

# 监听域名中带有group的,交给FastDFS模块处理
location ~/group([0-9])/ {
ngx_fastdfs_module;
}

location / {
root html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

启动,进入/usr/bin目录,注意改成自己的目录,执行

1
./nginx

Nqjli8.png

通过命令看是否启动成功

1
ps -ef | grep nginx


设置开机启动,网上的很多ubuntu设置开机启动都是有问题的

先看centos操作

1
vim /etc/init.d/nginx

一个空文件?没关系 复制以下内容,注意一下nginx=”/usr/bin/nginx”和NGINX_CONF_FILE=”/opt/nginx/conf/nginx.conf”这两句要对应自己的目录

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: NGINX is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/bin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
if [ -n "$user" ]; then
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
fi
}

start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}

stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}

restart() {
configtest || return $?
stop
sleep 1
start
}

reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}

force_reload() {
restart
}

configtest() {
$nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
status $prog
}

rh_status_q() {
rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

修改权限

1
2
# 修改权限
chmod 777 /etc/init.d/nginx

设置开机启动

1
2
chkconfig --add /etc/init.d/nginx 
chkconfig nginx on

再看ubuntu操作

网上很多方法比如安装什么sysv,我亲测无效,然后看到这篇博客

https://www.cnblogs.com/hellxz/p/9441949.html

亲测有效,不过原博客似乎漏了修改权限的操作

1
sudo vim /etc/init.d/nginx.sh

空文件?没关系,复制下面这段,/usr/bin/nginx改成自己的启动文件下的nginx,/opt/nginx/conf/nginx.conf改成自己的配置文件下的nginx.conf,然后修改成自己的登录密码

1
2
3
4
5
6
#!/bin/bash
#auto run nginx when system startup
sudo -S /usr/bin/nginx -c /opt/nginx/conf/nginx.conf << EOF
登录密码
EOF
exit 0

修改权限(原文忘了这点,要加上)

1
chmod 777 /etc/init.d/nginx.sh

添加开机重启

1
sudo update-rc.d  nginx.sh defaults

4. java端需要进行的操作

  1. 依赖
1
2
3
4
5
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.2</version>
</dependency>
  1. 配置类
1
2
3
4
5
6
7
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {

}
  1. yml
1
2
3
4
5
6
7
8
fdfs:
so-timeout: 1501 # 超时时间
connect-timeout: 601 # 连接超时时间
thumb-image: # 缩略图
width: 60
height: 60
tracker-list: # tracker地址:你的虚拟机服务器地址+端口(默认是22122)
- 192.168.72.128:22122
  1. 测试类

在G盘根目录下准备一张测试用图1.jpg

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
@SpringBootTest
@RunWith(SpringRunner.class)
public class FastDFSTest {

@Autowired
private FastFileStorageClient storageClient;

@Autowired
private ThumbImageConfig thumbImageConfig;

@Test
public void testUpload() throws FileNotFoundException {
// 要上传的文件
File file = new File("G:\\1.jpg");
// 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
StorePath storePath = this.storageClient.uploadFile(
new FileInputStream(file), file.length(), "jpg", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
}

@Test
public void testUploadAndCreateThumb() throws FileNotFoundException {
File file = new File("G:\\1.jpg");
// 上传并且生成缩略图
StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
new FileInputStream(file), file.length(), "png", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
// 获取缩略图路径
String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
System.out.println(path);
}
}

我们可以看到getFullPath()打印了组信息,这时候服务器上已经有了上传的图片

NLIKzt.png

浏览器可以通过http://192.168.72.128/group1/M00/00/00/wKhIgF78pUCAPLLYAACFQPZnSLk185.jpg访问到服务器的图片,也就是服务器ip+getFullPath()打印的信息

NLINJs.png

如果是前端传入的图片,那么应该是MultipartFile file这个类型的

也是一样调用uploadImageAndCrtThumbImage方法,获得相同的参数即可(getInputStream可以获得流,getOriginalFilename经过切割可以获得后缀名,具体操作如下)

1
2
String originalFilename = file.getOriginalFilename();
StorePath path = this.storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), StringUtils.substringAfterLast(originalFilename, "."), null);
#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×