分布式文件系统 SpringBoot+FastDFS+Vue.js【四】

分布式文件系统 SpringBoot+FastDFS+Vue.js【四】

  • 八、文件的下载和删除功能
    • 8.1.FastDFSClient.java
    • 8.2.FileServerController.java
    • 8.3.Vue的fast.js
    • 8.4.fastdfsimg.vue
    • 8.5.效果
  • 九、总结
  • endl

八、文件的下载和删除功能

8.1.FastDFSClient.java

@Slf4j
public class FastDFSClient {static {//加载fastDFS客户端的配置文件try {ClientGlobal.initByProperties("config/fastdfs-client.properties");log.info("network_timeout = {} ms", ClientGlobal.g_network_timeout);log.info("charset= {}", ClientGlobal.g_charset);} catch (IOException e) {e.printStackTrace();} catch (MyException e) {e.printStackTrace();}}/*** 上传文件** @param file* @param fastDFSFile* @return* @throws IOException*/public static FastDfsFile upload(MultipartFile file, FastDfsFile fastDFSFile) throws IOException {byte[] file_buff = null;//把文件转成输入流InputStream inputStream = file.getInputStream();if (inputStream != null) {//获取输入流中可读取的数据大小int len = inputStream.available();//创建足够大的缓冲区file_buff = new byte[len];//一次性把输入流中的数据全都读入到缓冲区file_buff,那file_buff就要足够大,占用内存也会很大inputStream.read(file_buff);}//关闭输入流inputStream.close();//通过fastDSF的client代码访问tracker和storagetry {//创建tracker的客户端TrackerClient trackerClient = new TrackerClient(ClientGlobal.getG_tracker_group());//通过TrackerClient对象获取TrackerServer信息TrackerServer trackerServer = trackerClient.getTrackerServer();StorageServer storageServer = null;//定义storage的客户端,建立与Storage服务器的连接StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);//文件元信息NameValuePair[] metaList = new NameValuePair[1];metaList[0] = new NameValuePair("fileName", fastDFSFile.getFileName());//执行上传String fileId = storageClient.upload_file1(file_buff, fastDFSFile.getExt(), metaList);log.info("upload success. file id is: {}", fileId);fastDFSFile.setFileId(fileId);fastDFSFile.setFilePath(fileId);fastDFSFile.setFileSize(file.getSize());fastDFSFile.setCreateTime(LocalDateTime.now());fastDFSFile.setUpdateTime(LocalDateTime.now());//通过调用service及dao将文件的路径存储到数据库中//关闭storage客户端storageClient.close();return fastDFSFile;} catch (Exception e) {log.error("上传文件失败:", e);e.printStackTrace();return null;}}/*** 删除文件** @param file_id* @return* @throws IOException* @throws MyException*/public static Boolean delete(String file_id) throws IOException, MyException {//通过fastDSF的client代码访问tracker和storage//创建tracker的客户端TrackerClient trackerClient = new TrackerClient(ClientGlobal.getG_tracker_group());//通过TrackerClient对象获取TrackerServer信息TrackerServer trackerServer = trackerClient.getTrackerServer();StorageServer storageServer = null;//定义storage的客户端,建立与Storage服务器的连接StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);//查询文件//upload success. file id is: group1/M00/00/00/wKjljWXHAauARHa2AAWwwNOt0hY257.pngString[] splitStr = file_id.split("/");String group_name = splitStr[0];//group1String remoteFileName = "";//M00/00/00/wKjljWXHAauARHa2AAWwwNOt0hY257.pngfor (int i = 1; i < splitStr.length; i++) {remoteFileName += splitStr[i];if (i != splitStr.length - 1) {remoteFileName += "/";}}log.info("group_name : {}", group_name);log.info("remoteFileName : {}", remoteFileName);FileInfo fileInfo = storageClient.query_file_info(group_name, remoteFileName);log.info("fileInfo = {}", fileInfo);if (fileInfo == null) {log.info("您删除的文件信息不存在,请核对后再次删除......");return false;}storageClient.delete_file1(file_id);log.info("删除成功");//关闭storage客户端storageClient.close();return true;}/*** 下载文件** @param file_id* @throws IOException* @throws MyException*/public static byte[] downloadFastFile(String file_id) throws IOException, MyException {//通过fastDSF的client代码访问tracker和storage//创建tracker的客户端TrackerClient trackerClient = new TrackerClient(ClientGlobal.getG_tracker_group());//通过TrackerClient对象获取TrackerServer信息TrackerServer trackerServer = trackerClient.getTrackerServer();StorageServer storageServer = null;//定义storage的客户端,建立与Storage服务器的连接StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);//查询文件//upload success. file id is: group1/M00/00/00/wKjljWXHAauARHa2AAWwwNOt0hY257.pngString[] splitStr = file_id.split("/");String group_name = splitStr[0];//group1String remoteFileName = "";//M00/00/00/wKjljWXHAauARHa2AAWwwNOt0hY257.pngfor (int i = 1; i < splitStr.length; i++) {remoteFileName += splitStr[i];if (i != splitStr.length - 1) {remoteFileName += "/";}}log.info("group_name : {}", group_name);log.info("remoteFileName : {}", remoteFileName);FileInfo fileInfo = storageClient.query_file_info(group_name, remoteFileName);log.info("fileInfo = {}", fileInfo);if (fileInfo == null) {log.info("您下载的文件信息不存在,请核对后再次下载......");return null;}//下载操作,传文件id返回字节流byte[] bytes = storageClient.download_file1(file_id);//关闭storage客户端storageClient.close();return bytes;}
}

8.2.FileServerController.java

@Slf4j
@RestController
@RequestMapping("/fastDFSFile")
public class FileServerController {@Resourceprivate FastDfsFileService fastDfsFileService;@Resourceprivate FastDfsFileTypeService fastDfsFileTypeService;@PostMapping("/upload")@ResponseBodypublic R upload(@RequestParam("file") MultipartFile file) throws IOException {//将文件先存储在web服务器上(本机),在调用fastDFS的client将文件上传到 fastDFS服务器FastDfsFile fastDFSFile = new FastDfsFile();String contentType = file.getContentType();//检验当前文件是否在上述集合中log.info("上传的文件类型为:{}", contentType);int count = fastDfsFileTypeService.selectByFileType(contentType);if (count < 1) {log.info("不支持此文件类型上传 : {}", contentType);return R.error().setCode(208).setMessage("不支持此文件类型上传 : " + contentType);}log.info("此文件类型为 : {}", contentType);fastDFSFile.setFileType(contentType);//文件原始名称String originalFilename = file.getOriginalFilename();log.info("原始文件名称 : {}", originalFilename);fastDFSFile.setFileName(originalFilename);//文件扩展名比如22.jpgString filenameExtension = StringUtils.getFilenameExtension(originalFilename);log.info("文件类型 = {}", filenameExtension);//jpgif (filenameExtension == null) {return R.error().setCode(208).setMessage("此文件没有文件扩展名");}fastDFSFile.setExt(filenameExtension);//新文件名称String fileName = UUID.randomUUID().toString().replace("-", "") + "." + filenameExtension;log.info("新文件名称 = {}", fileName);FastDfsFile fastDfsFile1 = FastDFSClient.upload(file, fastDFSFile);if (fastDfsFile1 != null) {fastDfsFileService.save(fastDfsFile1);Long id = fastDfsFileService.selectByFileId(fastDfsFile1.getFileId());fastDfsFile1.setId(id);return R.ok().setCode(200).setMessage("上传成功").data("fastDfsFile", fastDfsFile1);}return R.error().setCode(208).setMessage("上传失败");}//restful风格@DeleteMapping()public R delete(@RequestParam("id") Long id, @RequestParam("fileId") String fileId) throws MyException, IOException {Boolean result = FastDFSClient.delete(fileId);if (!result) {log.info("删除失败");return R.error().setCode(208).setMessage("删除失败");}int count = fastDfsFileService.deleteFastDfsFileById(id);if (count < 1) {log.info("删除失败");return R.error().setCode(208).setMessage("删除失败");}log.info("删除成功");return R.ok().setCode(200).setMessage("删除成功");}@GetMapping()public void downloadfile(HttpServletResponse response, String fileId, String fileName) throws IOException, MyException {if (fileId == null) return;log.info("fileName = {}", fileName);response.setContentType("application/force-download;charset=UTF-8");response.setCharacterEncoding("UTF-8");response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("gb2312"), "ISO-8859-1"));byte[] bytes = FastDFSClient.downloadFastFile(fileId);FileInputStream fis = null;log.info("fileId = {}", fileId);int len = 0;OutputStream outputStream = null;try {outputStream = response.getOutputStream();if (bytes == null) {return;}log.info("success");outputStream.write(bytes);outputStream.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (outputStream != null) {outputStream.close();}if (fis != null) {fis.close();}} catch (IOException e) {throw new RuntimeException(e);}}}@GetMapping("/getPageFastImg/{page}/{limit}")public R getPageFastImg(@PathVariable int page, @PathVariable int limit) {PageBean<FastDfsFile> pageBean = fastDfsFileService.findFastDfsFileByPage(page, limit);return R.ok().setCode(200).setMessage("查询成功").data("pageBean", pageBean);}
}

8.3.Vue的fast.js

import request from "../../utils/request";const api_name = '/fastDFSFile'export default {//上传图片uploadImg() {return request({url: `${api_name}`,method: 'post',})},getPageFastImg(page, limit) {return request({url: `${api_name}/getPageFastImg/${page}/${limit}`,method: 'get',})},getNextPageFastImg(page, limit) {return request({url: `${api_name}/getPageFastImg/${page}/${limit}`,method: 'get',})},//restful风格 ?id=123&fileId=456deleteFastImg(id, fileId) {return request({url: `${api_name}`,method: 'delete',params: {"id": id,"fileId": fileId}})},getFileSrc(fileId) {return request({url: `${api_name}`,method: 'get',params: {"fileId": fileId},responseType: 'blod'})},
}

8.4.fastdfsimg.vue

<template><div><h2>图片管理</h2><!--图片列表--><el-tablesize="small"style="margin: 30px;"empty-text="无数据":data="imgList"highlight-current-row v-loading="loading" border element-loading-text="拼命加载中"><el-table-column align="center" sortable prop="filePath" label="文件路径" width="450"></el-table-column><el-table-column align="center" sortable prop="fileSize" label="文件大小" width="100"></el-table-column><el-table-column align="center" sortable prop="fileName" label="文件名" width="130"></el-table-column><el-table-column align="center" sortable prop="ext" label="扩展名" width="100"></el-table-column><el-table-column align="center" sortable prop="fileType" label="文件类型" width="100"></el-table-column><el-table-column align="center" sortable prop="filePath" label="预览图片" width="100"><template slot-scope="scope"><img :src="getImageUrl(scope.row.filePath)" style="max-width: 100px;max-height: 100px" alt="图标"/></template></el-table-column><el-table-column label="操作" width="200" align="center"><template slot-scope="scope"><el-button type="text" size="small" icon="el-icon-download" @click="getFileSrc(scope.row)">下载</el-button><el-popconfirm title="确定删除吗?" @confirm="handleDeleteOne(scope.row)"><template #reference><el-button type="danger" size="small" icon="el-icon-delete">删除</el-button></template></el-popconfirm></template></el-table-column></el-table><!-- 分页 --><el-pagination class="pagination" style="text-align: center;margin-top: 50px"layout="prev, pager, next":current-page="page":total="total":page-size="limit"@current-change="fetchData"></el-pagination></div>
</template><script>
import fastApi from "@/api/fastdfs/fast";
import request from "../../utils/request";export default {name: "FastdfsImg",data() {return {total: 0, // 数据库中的总记录数page: 1, // 默认页码limit: 5, // 每页记录数imgList: {},//imagePath: 'http://192.168.229.141/', // 图片的基础路径}},created() {this.init()},methods: {init() {fastApi.getPageFastImg(this.page, this.limit).then(response => {this.imgList = response.data.pageBean.liststhis.total = response.data.pageBean.totalCount})},//获取图片路径getImageUrl(filePath) {//return `${this.imagePath}${filePath}`; // 拼接图片路径return this.$baseImagePath + '/' + filePath; // 拼接图片路径},//下一页fetchData(page) {this.page = pagefastApi.getNextPageFastImg(this.page, this.limit).then(response => {this.imgList = response.data.pageBean.liststhis.total = response.data.pageBean.totalCount})},// 单选删除handleDeleteOne(FastDfsFile) {fastApi.deleteFastImg(FastDfsFile.id, FastDfsFile.fileId).then(response => {this.$message.success(response.message)this.init()})},// 下载文件getFileSrc(FastDfsFile) {//window.open(this.$baseImagePath+'/'+FastDfsFile.fileId,"_blank");/*fastApi.downloadFastImg(FastDfsFile.fileId).then(response=>{this.$message.success(response.message)})*/window.location.href = request.defaults.baseURL + '/fastDFSFile?fileId=' + FastDfsFile.fileId + '&&fileName=' + FastDfsFile.fileName;}},
}
</script><style scoped></style>

8.5.效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

九、总结

  • 案例有些不足
  • 功能太简单
  • 功能复杂可以做一个类似网盘的文件管理系统
  • 仅仅学习使用某些功能
  • 暂不深入开发
  • 有兴趣的伙伴可以尝试一番
  • 类似于阿里云oss

endl

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471894.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【lesson56】生产者消费者模型

文章目录 学习生产者消费者模型过程中要回答的两个问题生产者消费者模型的概念基于阻塞队列的生产者消费者模型编码实现Common.hLockGuard.hppCondtion.hppBlockQueue.hppTask.hppConProd.cc 学习生产者消费者模型过程中要回答的两个问题 1.条件变量是在条件满足的时候&#x…

Python4Delphi: Delphi 程序使用 Python 抓取网页

想用程序去抓取一个网页的内容&#xff0c;Delphi 有自己的 HTTP 库。比如 Indy 的 TIdHTTP&#xff0c;或者 TNetHTTPClient。 这里测试一下使用 Python 的 HTTP 库抓取网页&#xff0c;然后把抓取的内容给 Delphi 的程序。 Delphi 程序&#xff0c;界面上拖控件如下&#x…

windows@命令行映射磁盘驱动器若干方法@开机自动映射网络磁盘

文章目录 windows映射网络磁盘驱动器资源管理器中GUI方式创建命令行方式创建命令行列出驱动器列表删除取消映射持久化配置映射&#x1f47a;记住凭证 FAQ开机自启登录系统后自动挂载&#x1f47a;[以alist webdav 挂载为例]分析对策延迟挂载&#x1f47a;Note 访问已经挂载网络…

最长连续手牌 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 有这么一款单人卡牌游戏&#xff0c;牌面由颜色和数字组成&#xff0c;颜色为红、黄、蓝、绿中的一种&#xff0c;数字为 0−9 中的一个。游戏开始时玩家从手牌中…

一篇文章彻底搞懂 TiDB 集群各种容量计算方式

作者丨hey-hoho 来自神州数码钛合金战队 神州数码钛合金战队是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景&#xff0c;全部拥有 TiDB 高级资格证书&#xff0c;并活跃于 TiDB 开源社区&#xff0c;是官方认证合作…

OpenCV Mat实例详解 四

OpenCV Mat实例详解三中详细介绍来了OpenCV Mat类的公有静态成员函数&#xff0c;下面介绍OpenCV Mat类的其他常用成员函数。 OpenCV Mat类常用成员函数 Mat & adjustROI (int dtop, int dbottom, int dleft, int dright)&#xff1b; dtop ROI 上边界移动值&#xff0c;如…

结构体对齐规则及为什么会有结构体对齐

前言&#xff1a; 大家在学习结构体中&#xff0c;在计算结构体大小时想必会很疑惑&#xff0c;为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放&#xff1f;今天带大家一起深入探讨一下背后的规则和原因。 结构体对齐规则&#xff1a; 结构体对齐其实…

【防网盘在线解压】Peazip 豌豆压缩 v9.7.0

软件介绍 Peazip 是一个免费的文件归档应用程序&#xff0c; 支持跨平台&#xff0c;是和WinRar、WinZip类似软件的开源免费替代品&#xff1b;支持压缩/ 存档到 7Z&#xff0c; ARC、Brotli BR、BZip2、GZip、 PAQ、PEA、RAR、自解压档案、TAR、WIM、XZ、Zstandard ZST、打开…

最短路径(dijstra算法,链式前向星,堆优化)

【模板】单源最短路径&#xff08;弱化版&#xff09; 对于这题我们使用邻接矩阵的话会导致弓箭复杂度会大大提升&#xff0c;所以我们就需要学习一种新的数据结构&#xff0c;名叫链式前向星&#xff0c;在链式前向星中&#xff0c;我们需要定义一个结构体数组&#xff0c;其中…

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babe…

SVD奇异值分解

一、奇异值 奇异值&#xff08;Singular Values&#xff09;是线性代数中矩阵的重要性质之一&#xff0c;与奇异值分解&#xff08;SVD&#xff09;密切相关。让我们来更详细地了解一下奇异值的概念&#xff1a; 定义&#xff1a; 对于一个矩阵 ( A )&#xff0c;它的奇异值是…