分布式文件系统与fastDFS

本文介绍了分布式文件系统FastDFS的基本概念和工作原理,并提供了使用Java进行文件上传的详细步骤,包括配置文件设置、Tracker与Storage Server的交互以及上传文件的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

分布式文件系统其实我也不是非常了解,作为it小白,初体验感觉就是类似百度云盘,可以存储照片文件等等。分布式文件系统选型:可以选择租用服务器七牛云(20G),阿里云对象存储,腾讯云对象存储,另外就是自己搭建需要硬件服务器和选择一个分布式的文件系统软件(fastdfs或者hdfs等)

提示:以下是本篇文章正文内容,下面案例可供参考

一、fastdfs是什么?

FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 架构包括 Tracker server 和 Storage server。客户端请求Tracker server服务器,Tracker server返回可用的Storage server的端口以及ip。客户端最终文件是存储在Storage server。
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
组名(卷):文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回,需要客户端自行保存。虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

二、使用步骤

搭建fastdfs,但是需要学习docker。现在我们直接用这个47.95.117.210
上传trackerserver端口22122
访问端口8888端口
入门:
需求:将本地图片上传至图片服务器,在控制台打印url
1.创建maven工程fastdfsDEMO
2.在pom.xml中引入依赖

cn.bestwu fastdfs-client-java 1.27 3.添加配置文件fdfs_client.conf,设置服务器地址tracker_server=47.95.117.210:22122 4.创建测试类创建主方法

2.测试

代码如下(示例):
// 1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。
ClientGlobal.init(“D:/maven_work/fastDFS-demo/src/fdfs_client.conf”);
// 2、创建一个 TrackerClient 对象。直接 new 一个。
TrackerClient trackerClient = new TrackerClient();
// 3、使用 TrackerClient 对象创建连接,获得一个 TrackerServer 对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 4、创建一个 StorageServer 的引用,值为 null
StorageServer storageServer = null;
// 5、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的引用
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 6、使用 StorageClient 对象上传图片。
//扩展名不带“.”
String[] strings = storageClient.upload_file(“D:/pic/benchi.jpg”, “jpg”,
null);
// 7、返回数组。包含组名和图片的路径。
for (String string : strings) {
System.out.println(string);
}

http://47.95.117.210:8888/组名/控制台打印输出的文件名

项目实战准备代码如下:
前端代码
handleSuccess(response, file, fileList){
    console.log("===========");
    console.log(response);
    console.log(file);
    console.log(fileList);
    this.shop.logo = response.resultObj;
},
handleRemove(file, fileList) {
    var filePath =file.response.resultObj;
    this.$http.delete("/dfs?path="+filePath)
        .then(res=>{
            if(res.data.success){
                this.$message({
                    message: '删除成功!',
                    type: 'success'
                });
            }else{
                this.$message({
                    message: '删除失败!',
                    type: 'error'
                });
            }
        })
},
后端代码:
@RestController
@RequestMapping("/dfs")
public class FastDfsController {
    @PostMapping
    public AjaxResult upload(@RequestPart(required = true,value = "file") MultipartFile file){

        try {
            System.out.println(file.getOriginalFilename() + ":" + file.getSize());
            String originalFilename = file.getOriginalFilename();
            // xxx.jpg
            String extName = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
            System.out.println(extName);
            String filePath =  FastDfsUtil.upload(file.getBytes(), extName);
            return AjaxResult.me().setResultObj(filePath); //把上传后的路径返回回去
        } catch (IOException e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("上传失败!"+e.getMessage());
        }
    }
    /**
     * 参数:完整路径 /goup1/xxxxx/yyyy
     * 返回值:成功与否,还要返回地址
     *
     */
    @DeleteMapping
    public AjaxResult del(@RequestParam(required = true,value = "path") String path){
        String pathTmp = path.substring(1); // goup1/xxxxx/yyyy
        String groupName =  pathTmp.substring(0, pathTmp.indexOf("/")); //goup1
        String remotePath = pathTmp.substring(pathTmp.indexOf("/")+1);// /xxxxx/yyyy
        System.out.println(groupName);
        System.out.println(remotePath);
        FastDfsUtil.delete(groupName, remotePath);
        return  AjaxResult.me();
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值