作者:狮子也疯狂
专栏:《Fastdfs连续剧》
坚持做好每一步,幸运之神自然会驾凌在你的身上
目录
- 一. 🦁 前言
- 二. 🦁 上传原理
- Ⅰ. 🐇 原理图解
- Ⅱ. 🐇 传输原理
- 三. 🦁 实战演示
- Ⅰ. 🐇 依赖加载
- Ⅱ. 🐇 编写fastdfs配置
- Ⅲ. 🐇 服务层实现
- 3.1 上传图解
- 3.2 原理步骤
- 3.3 实现代码展示
- 四. 🦁 总结
一. 🦁 前言
我们在做项目的时候,肯定少不了编写文件上传的这个功能,但是在一般上传的文件都是上传到Windows本地,如果需要部署的话,那么我们就得将文件上传到虚拟机,不然会因为写在本地的存储路径,将无法得到存储而报错,狮子之前在做那个校园招聘系统项目的时候,就是没有意识到这个问题,所以部署到虚拟机,上传简历的功能就使用不了了。我们将文件上传到虚拟机的方法有两个:
一、自己搭建一个文件目录,然后在编写代码的过程中,将ip和文件存储地址生成路径返回。
二、狮子介绍一个轻量级分布式文件系统,使用起来比第一个方便一点,并且解决了大数据量存储和负载均衡等问题。如下:
二. 🦁 上传原理
Ⅰ. 🐇 原理图解
Ⅱ. 🐇 传输原理
- 首先,客户端请求`Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件。
- 存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息。
- 客户端保存相关信息上传完毕。
三. 🦁 实战演示
这里借助于fastdfs集成Nginx服务器,通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实现通过http请求访问存储节点资源。
需要自己在虚拟机或者服务器搭建Fastdfs服务器和Nginx服务器。并且配置好要用的参数。
欲知安装详情,请点击:查看
Ⅰ. 🐇 依赖加载
在Maven POM文件中添加fastdfs依赖
。
<!-- FastDFS -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.5</version>
</dependency>
Ⅱ. 🐇 编写fastdfs配置
在yaml文件中添加fastdfs连接配置:
fdfs:
so-timeout: 3000
connect-timeout: 6000
tracker-list:
- 192.168.66.140:22122
fileUrl: 192.168.66.140
tips:
配置参数解释
- so-timeout:读取数据超时间
- connect-timeout:连接超时时间
- tracker-list:跟踪服务器,主要作调度工作,这里是一个数组的形式,表示可以连接多个
- fileUrl:自定义参数配置,文件访问路径
Ⅲ. 🐇 服务层实现
3.1 上传图解
3.2 原理步骤
步骤:
- 获取fastdfs的客户端对象FastFileStorageClient,
- 文件字节数组和文件名作为方法的两个参数。
- 将图片字节数组文件转为字节输出流。获取文件名的后缀名。
- 使用uploadFile()方法将文件上传。
- 返回上传文件成功后的存储路径。
若上传失败,则抛出自定义异常。
3.3 实现代码展示
public class FileServiceImpl implements FileService {
@Autowired
private FastFileStorageClient fastFileStorageClient;
@Value("${fdfs.fileUrl}")
private String fileUrl; //Nginx访问fastdfs中文件路径
/**
* 上传文件
*
* @param fileBytes 文件转成的字节数组
* @param fileName 文件名
* @return 上传后的文件访问路径
*/
@Override
public String uploadImage(byte[] fileBytes, String fileName){
if (fileBytes.length != 0){
try {
// 1.将字节数组文件转为输入流
InputStream inputStream = new ByteArrayInputStream(fileBytes);
// 2.获取文件后缀名
String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);
// 3.上传文件
StorePath storePath = fastFileStorageClient.uploadFile(inputStream, inputStream.available(), fileSuffix, null);
// 4.返回文件路径
String imageUrl = fileUrl+"/"+storePath.getFullPath();
return imageUrl;
}catch (IOException ioException){
throw new BusException(CodeEnum.UPLOAD_FILE_ERROR);
}
}else {
throw new BusException(CodeEnum.UPLOAD_FILE_ERROR);
}
}
}
四. 🦁 总结
今天分享如何使用fastdfs上传文件功能,详细描述了上传的原理以及实战演示。希望能够帮到你。😄