分布式文件存储FastDFS
链接:https://pan.baidu.com/s/1Cle7VaKBUce6K3xxBFcxFg
提取码:737r
1. 上传文件到
将资料中的文件上传到linux下的/usr/local/fdfs目录
2. 安装依赖
安装GCC依赖
yum -y install gcc
安装unzip工具
yum install -y unzip zip
安装libevent
yum -y install libevent
安装Nginx所需依赖
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
安装libfastcommon-master
- 解压 libfastcommon-master.zip
- cd /usr/local/fdfs
- unzip libfastcommon-master.zip
- 编译安装
- cd libfastcommon-master
- ./make.sh
- ./make.sh install
安装FastDFS
解压
- cd /usr/local/fdfs/
- tar -xvf FastDFS_v5.08.tar.gz
进入目录
cd FastDFS
编译并安装
- ./make.sh
- ./make.sh install
校验安装结果
查看FastDFS启动脚本
- cd /etc/init.d/
- ll /etc/init.d/ | grep fdfs
fdfs_trackerd 是tracker启动脚本
fdfs_storaged 是storage启动脚本
查看配置文件模板
cd /etc/fdfs
tarcker.conf.sample 是tracker的配置文件模板
storage.conf.sample 是storage的配置文件模板
client.conf.sample 是客户端的配置文件模板
启动tracker
编辑tracker配置
- cd /etc/fdfs/
- cp tracker.conf.sample tracker.conf
- vim tracker.conf
修改base_path配置
4. tracker的数据和日志存放目录
5. base_path=/usr/local/fdfs/tracker
创建目录
- mkdir -p /usr/local/fdfs/tracker
启动tracker
- sh /etc/init.d/fdfs_trackerd start
- 或
- service fdfs_trackerd start
停用tracker
- service fdfs_trackerd stop
设置开机启动 - chkconfig fdfs_trackerd on
启动storage
编辑storage配置
- cd /etc/fdfs/
- cp storage.conf.sample storage.conf
- vim storage.conf
修改base_path配置
- storage的数据和日志存放目录
- base_path=/usr/local/fdfs/storage
- storage的上传文件存放路径
- store_path0=/usr/local/fdfs/storage
- tracker的地址(更换成自己机器的IP)
- tracker_server=192.168.xx.xx:22122
创建目录
- mkdir -p /usr/local/fdfs/storage
启动storage
- sh /etc/init.d/fdfs_storaged start
- 或
- service fdfs_storaged start
停用storage
- service fdfs_storaged stop
设置开机启动
- chkconfig fdfs_storaged on
查看进程
- ps -ef | grep fdfs
安装FastDFS的Nginx模块
解压
- cd /usr/local/fdfs/
- tar -xvf fastdfs-nginx-module_v1.16.tar.gz
配置config文件
进入配置目录
- cd fastdfs-nginx-module/src/
修改配置
- vim config
执行下面命令
- :%s+/usr/local/+/usr/+g
配置mod_fastdfs.conf
- cd /usr/local/fdfs/fastdfs-nginx-module/src/
- cp mod_fastdfs.conf /etc/fdfs/
- vim /etc/fdfs/mod_fastdfs.conf
修改为以下配置
connect_timeout=10 # 客户端访问文件连接超时时长(单位:秒)
tracker_server=192.168.1.120:22122 # tracker服务IP和端口(更换成自己机器的IP)
url_have_group_name=true # 访问链接前缀加上组名
store_path0=/usr/local/fdfs/storage # 文件存储路径
复制 FastDFS的部分配置文件到/etc/fdfs目录
- cd /usr/local/fdfs/FastDFS/conf/
- cp http.conf mime.types /etc/fdfs/
安装Nginx
解压
- cd /usr/local/fdfs/
- tar -xvf nginx-1.16.1.tar.gz
配置
添加FastDFS模块
- cd nginx-1.16.1/
- ./configure --add-module=/usr/local/fdfs/fastdfs-nginx-module/src
重新编译
- make && sudo make install
配置nginx整合fastdfs-module模块
修改nginx配置文件
- vim /usr/local/nginx/conf/nginx.conf
将文件中,原来的server 80{ …} 部分代码替换为如下代码:
server {
listen 80;
server_name localhost;
# 监听域名中带有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;
}
}
启动nginx
- cd /usr/local/nginx/sbin
- ./nginx # 启动
- ./nginx -s stop # 停止
- ./nginx -s reload # 重新加载配置
关闭防火墙
查看防火墙的状态的命令为:sudo systemctl status firewalld。
打开防火墙的方式有两种,一种是打开后重启会恢复回原来的状态,命令为:sudo systemctl start firewalld;
另一种是打开后重启不会恢复到原来的状态,命令为:sudo systemctl enable firewalld,这种方式输入命令后要重启系统才会生效。
关闭防火墙的方式也有两种,和打开相对应,命令分别为
sudo systemctl stop firewalld
sudo systemctl disable firewalld
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
</dependencies>
FastDFS配置
在resources文件夹下创建fasfDFS的配置文件fdfs_client.conf
connect_timeout=60
network_timeout=60
charset=UTF-8
http.tracker_http_port=80
# 配置成自己的IP地址
tracker_server=192.168.xx.xx:22122
connect_timeout:连接超时时间,单位为秒。
network_timeout:通信超时时间,单位为秒。发送或接收数据时。假设在超时时间后还不能发送或接收数据,则本次网络通信失败
charset: 字符集
http.tracker_http_port :.tracker的http端口
tracker_server: tracker服务器IP和端口设置
application.yml配置
在resources文件夹下创建application.yml
spring:
servlet:
multipart:
max-file-size: 10MB # 单个文件大小
max-request-size: 10MB # 总上传数据大小
application:
name: file-server
server:
port: 7008
max-file-size是单个文件大小,max-request-size是设置总上传的数据大小
文件上传
件信息封装
文件上传一般都有文件的名字、文件的内容、文件的扩展名、文件的md5值、文件的作者等相关属性,我们可以创建一个对象封装这些属性,代码如下:
创建com.ddz.entity.FastDFSFile代码如下:
package com.ddz.entity;
import java.io.Serializable;
import java.util.Arrays;
public class FastDFSFile implements Serializable {
//文件名字
private String name;
//文件内容
private byte[] content;
//文件扩展名
private String ext;
//文件MD5摘要值
private String md5;
//文件创建作者
private String author;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public String getExt() {
return ext;
}
public void setExt(String ext) {
this.ext = ext;
}
public String getMd5() {
return md5;
}
public void setMd5(String md5) {
this.md5 = md5;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "FastDFSFile{" +
"name='" + name + '\'' +
", content=" + Arrays.toString(content) +
", ext='" + ext + '\'' +
", md5='" + md5 + '\'' +
", author='" + author + '\'' +
'}';
}
}
(可选)测试文件相关操作
import com.zb.pojo.FastDFSFile;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@Component
public class FastDFSUtil {
static {
String path = new ClassPathResource("fdfs_client.conf").getPath();
try {
ClientGlobal.init(path);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
}
public static String [] upload(FastDFSFile fastDFSFile)throws Exception{
NameValuePair [] meta_list = new NameValuePair[1];
meta_list[0]=new NameValuePair(fastDFSFile.getAuthor());
/***
* 文件上传后的返回值
* uploadResults[0]:文件上传所存储的组名,例如:group1
* uploadResults[1]:文件存储路径,例如:M00/00/00/wKjThF0DBzaAP23MAAXz2mMp9oM26.jpeg
*/
String [] uploadResults = null;
TrackerClient trackerClient = new TrackerClient();
TrackerServer connection = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(connection, null);
uploadResults= storageClient.upload_file(fastDFSFile.getContent(),fastDFSFile.getExt(),meta_list);
return uploadResults;
}
public void upload() throws Exception {
TrackerClient trackerClient = new TrackerClient();
TrackerServer connection = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(connection, null);
String[] mp4s = storageClient.upload_file("E:\\14bd8e05-84e0-40e8-88ce-9712831698c8.mp4", "mp4", null);
for (String mp4 : mp4s) {
System.out.println(mp4);
}
}
public void delete()throws Exception{
//创建TrackerClient客户端对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient对象获取TrackerServer信息
TrackerServer trackerServer = trackerClient.getConnection();
//获取StorageClient对象
StorageClient storageClient = new StorageClient(trackerServer, null);
//执行文件上传
int group1 = storageClient.delete_file("group1", "M00/00/00/wKgBbl-ag1aAQe-LADQRbSP7hcU218.mp4");
System.out.println(group1);
}
/***
* 获取Tracker服务地址
*/
public static String getTrackerUrl(){
try {
//创建TrackerClient对象
TrackerClient trackerClient = new TrackerClient();
//通过TrackerClient获取TrackerServer对象
TrackerServer trackerServer = trackerClient.getConnection();
//获取Tracker地址
return "http://"+trackerServer.getInetSocketAddress().getHostString()+":"+ClientGlobal.getG_tracker_http_port();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void download(String filename)throws Exception{
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
byte[] bytes = storageClient.download_file("group1", filename);
File file = new File("d://a.mp4");
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.close();
}
public void getFileInfo(String filename)throws Exception{
TrackerClient trackerClient =new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
FileInfo group1 = storageClient.get_file_info("group1", filename);
System.out.println(group1);
}
}
创建一个FileController,在该控制器中实现文件上传操作,代码如下:
@RestController
@CrossOrigin
public class FileController {
/***
* 文件上传
* @return
*/
@PostMapping(value = "/upload")
public String upload(@RequestParam("file") MultipartFile file) throws Exception {
//封装一个FastDFSFile
FastDFSFile fastDFSFile = new FastDFSFile(
file.getOriginalFilename(), //文件名字
file.getBytes(), //文件字节数组
StringUtils.getFilenameExtension(file.getOriginalFilename()));//文件扩展名
//文件上传
String[] uploads = FastDFSUtil.upload(fastDFSFile);
//组装文件上传地址
return FastDFSUtil.getTrackerUrl()+"/"+uploads[0]+"/"+uploads[1];
}
}
Postman测试文件上传
选择post请求方式,输入请求地址