SpringBoot整合FastDFS实现文件的上传下载和删除
Posted yuwenS.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合FastDFS实现文件的上传下载和删除相关的知识,希望对你有一定的参考价值。
SpringBoot整合FastDFS实现文件的上传、下载和删除
前期准备
具体准备跟Java实现实现文件的上传、下载和删除一样
可以看这里参考:https://blog.csdn.net/qq_45334037/article/details/117931295?spm=1001.2014.3001.5501
具体实现
- 新建一个springboot工程在pom.xml导入的jar包,这个fastdfs包是自己打包的
<!-- fastdfs -->
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.46</version>
</dependency>
- 在resources文件下新建fastdfs.conf文件并编写
tracker_server=服务器地址:22122 //表示tracker的地址和端口如果是集群有多个就继续往下写
- application.yml文件的配置
server:
port: 9999
spring:
thymeleaf:
cache: false
mode: html
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://服务器地址:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username: 数据库用户名
password: 数据库密码
mybatis:
type-aliases-package: com.yuwen.pojo
configuration:
map-underscore-to-camel-case: true
- Student实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student
private String id; //学生id
private String name; //学生姓名
private String workName; //作业名称
private String groupName; //上传后的组名
private String remoteFilePath; //上传后的路径
private long fileSize; //上传的文件大小
private String fileOldName; //上传的文件名
- StudentService接口
public interface StudentService
//查询所有信息
List<Student> findAll();
//修改学生信息
void updateStudent(Student student);
//根据id查询信息
Student findStuById(String id);
//删除信息
void deleteById(String id);
- StudentServiceImpl类
@Service
public class StudentServiceImpl implements StudentService
@Resource
StudentMapper studentMapper;
//查询所有信息
@Override
public List<Student> findAll()
return studentMapper.findAll();
//修改信息 增加文件信息
@Override
public void updateStudent(Student student)
studentMapper.updateStudent(student);
//根据id查询信息
@Override
public Student findStuById(String id)
return studentMapper.findStuById(id);
//删除文件信息
@Override
public void deleteById(String id)
Student student = studentMapper.findStuById(id);
FastDFSUtil.delete(student.getGroupName(),student.getRemoteFilePath());
student.setGroupName("");
student.setRemoteFilePath("");
student.setFileSize(0L);
student.setFileOldName("");
studentMapper.updateStudent(student);
- ServiceController类
@Controller
public class StudentController
@Resource
StudentService studentService;
@GetMapping("/")
public String findAll(Model model)
List<Student> studentList = studentService.findAll();
model.addAttribute("studentList",studentList);
return "index";
@GetMapping("/upload/id")
public String toUpload(@PathVariable String id, Model model)
Student student = studentService.findStuById(id);
model.addAttribute("student",student);
return "upload";
//上传文件
@PostMapping("/upload")
public String upload(String id, MultipartFile myFile,Model model) throws IOException
//获取文件字节数组
byte[] bufferFile = myFile.getBytes();
//获取文件名
String fileName = myFile.getOriginalFilename();
//获取文件大小
Long fileSize = myFile.getSize();
//获取文件后缀名
String fileExtName = fileName.substring(fileName.lastIndexOf(".")+1);
String[] result = FastDFSUtil.upload(bufferFile, fileExtName);
Student student = studentService.findStuById(id);
student.setGroupName(result[0]);
student.setRemoteFilePath(result[1]);
student.setFileSize(fileSize);
student.setFileOldName(fileName);
studentService.updateStudent(student);
model.addAttribute("msg","上传成功");
return "redirect:/";
/**
* 完成文件下载
* @param id 需要下载的文件主键
* @return ResponseEntity 表示一个响应的实体,这个类是Spring提供的一个类,这个类是Spring响应数据时的一个对象
* 这个对象用包含则响应时的编码例如404 200 等等,以及响应的头文件信息,以及响应时的具体数据
* 这个数据可以是一段html代码,也可以是一段js,也可以是一段普通字符串,也可以是一个文件的流
*/
@GetMapping("/download/id")
public ResponseEntity<byte[]> download(@PathVariable String id)
Student student = studentService.findStuById(id);
byte [] bytes=FastDFSUtil.download(student.getGroupName(),student.getRemoteFilePath());
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//设置响应类型为文件类型
headers.setContentLength(student.getFileSize());//设置响应时的文件大小用于自动提供下载进度
//设置下载时的默认文件名
headers.setContentDispositionFormData("attachment",student.getFileOldName());
/**
* 创建响应实体对象,Spring会将这个对象返回给浏览器,作为响应数据
* 参数 1 为响应时的具体数据
* 参数 2 为响应时的头文件信息
* 参数 3 为响应时的状态码
*/
ResponseEntity<byte[]> responseEntity=new ResponseEntity<byte[]>(bytes,headers, HttpStatus.OK);
return responseEntity;
//删除文件
@GetMapping("/delete/id")
public String delete(@PathVariable String id)
studentService.deleteById(id);
return "redirect:/";
- FastDFSUtils工具类的编写,主要操作
public class FastDFSUtil
/**
* 文件上传
*/
public static String [] upload(byte[] buffFile,String fileExtName)
TrackerServer ts=null;
StorageServer ss=null;
try
//读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
ClientGlobal.init("fastdfs.conf");
TrackerClient tc=new TrackerClient();
ts=tc.getConnection();
ss=tc.getStoreStorage(ts);
//定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传 下载和删除操作
StorageClient sc=new StorageClient(ts,ss);
/**
* 文件上传
* 参数 1 为需要上传的文件的字节数组
* 参数 2 为需要上传的文件的扩展名
* 参数 3 为文件的属性文件通常不上传
* 返回一个String数组 这个数据对我们非常总要必须妥善保管建议存入数据库
* 数组中的第一个元素为文件所在的组名
* 数组中的第二个元素为文件所在远程路径名
*/
String[] result= sc.upload_file(buffFile,fileExtName,null);
return result;
catch (IOException | MyException e)
e.printStackTrace();
finally
if(ss!=null)
try
ss.close();
catch (IOException e)
e.printStackTrace();
if(ts!=null)
try
ts.close();
catch (IOException e)
e.printStackTrace();
return null;
/**
* 下载文件
*/
public static byte [] download(String groupName,String remoteFilename)
TrackerServer ts=null;
StorageServer ss=null;
try
//读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
ClientGlobal.init("fastdfs.conf");
TrackerClient tc=new TrackerClient();
ts=tc.getConnection();
ss=tc.getStoreStorage(ts);
//定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传 下载和删除操作
StorageClient sc=new StorageClient(ts,ss);
/**
* 文件下载
* 参数1 需要下载的文件的组名
* 参数2 需要下载文件的远程文件名
* 返回一个int类型的数据 返回0 表示文件下载成功其它值表示文件在下载失败
*/
byte [] buffFile=sc.download_file(groupName,remoteFilename);
return buffFile;
catch (IOException | MyException e)
e.printStackTrace();
finally
if(ss!=null)
try
ss.close();
catch (IOException e)
e.printStackTrace();
if(ts!=null)
try
ts.close();
catch (IOException e)
e.printStackTrace();
return null;
/**
* 文件删除
*/
public static void delete(String groupName,String remoteFilename)
TrackerServer ts=null;
StorageServer ss=null;
try
//读取FastDFS的配置文件用于将所有的tracker的地址读取到内存中
ClientGlobal.init("fastdfs.conf");
TrackerClient tc=new TrackerClient();
ts=tc.getConnection();
ss=tc.getStoreStorage(ts);
//定义Storage的客户端对象,需要使用这个对象来完成具体的文件上传 下载和删除操作
StorageClient sc=new StorageClient(ts,ss);
/**
* 文件删除
* 参数1 需要删除的文件的组名
* 参数2 需要删除文件的远程文件名
* 返回一个int类型的数据 返回0 表示文件删除成功其它值表示文件在删除失败
*/
int result=sc.delete_file(groupName,remoteFilename);
System.out.println(result);
catch (IOException | MyException e)
e.printStackTrace();
finally
if(ss!=null)
try
ss.close();
catch (IOException e)
e.printStackTrace();
if(ts!=null)
try
ts.close();
catch (IOException e)
e.printStackTrace();
- StudentMapper接口
@Mapper
@Repository
public interface StudentMapper
//查询所有信息
@Select("select * from student")
List<Student> findAll();
//修改信息
@Update("update student set group_name=#groupName,remote_file_path=#remoteFilePath,file_size=#fileSize,file_old_name=#fileOldName where id=#id")
void updateStudent(Student student);
//根据id查询信息
@Select("select * from student where id = #id")
Student findStuById(String id);
html网页
- index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td>id</td>
<td>姓名</td>
<td>作业名</td>
<td>操作</td>
</tr>
<tr th:each="student:$studentList">
<td th:text="$student.getId()">id</td>
<td th:text="$student.getName()">姓名</td>
<td th:text="$student.getWorkName()以上是关于SpringBoot整合FastDFS实现文件的上传下载和删除的主要内容,如果未能解决你的问题,请参考以下文章