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 FastDFS快速实现和SpringBoot的整合开发