FastDFS分布式文件系统——上传本地文件

目录

安装FastDFS

FastDFS

使用Java客户端上传本地文件到FastDFS服务器上

pom.xml

fastdfs_conf配置文件

FastDFS

测试


安装FastDFS

  • 1、用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园 (cnblogs.com)
  • 2、FastDFS文件上传功能封装 - 动力节点 (bjpowernode.com)
  • 3、
  • 注意事项:
    • 我主要是按照第二篇文章安装,但经常在make编译时出错,出错后,又按照第一篇文章重新下载资源,再编译,一般都通过。
    • 下面“使用Java客户端上传本地文件到FastDFS服务器上”的项目示例,是按照第二篇文章进行学习的
    • 更改配置文件里的tracker_server时,用的地址是linux的IP地址

FastDFS

  • FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

    FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。 

    • Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。 

    • Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

    • Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

使用Java客户端上传本地文件到FastDFS服务器上

1、下载fastdfs-client-java-master

wangwei216/fastdfs-client-java-master (github.com)

2、打包成jar包,导入本地Maven仓库

The POM for org.csource:fastdfs-client-java:jar:1.27-RELEASE is missing_could not find artifact org.csource:fastdfs-client-CSDN博客

3、新建一个Project,Module

项目结构:

pom.xml

  • 如果tracketClient.getConnection()爆红,fast-client-java的依赖选用1.27版本即可
  • 如果在自己Maven的本地仓库找到该依赖,但项目仍然报错,说找不到该依赖,检查settings里的Maven仓库地址是否改为了本地仓库地址
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.study</groupId>
    <artifactId>fastdfs</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--加入FastDFS的java客户端依赖-->
    <dependencies>
        <dependency>
            <groupId>org.csource</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

fastdfs_conf配置文件

  • 从第一步下载的fastdfs-client-java-master里的复制fastdfs_conf过来,然后把tracker_server的IP地址改成linux的IP地址
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890

#tracker_server = 10.0.11.247:22122
#tracker_server = 10.0.11.248:22122
#tracker_server = 10.0.11.249:22122
tracker_server = 192.168.40.128:22122

FastDFS

package com.study.fastdfs;

import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

public class FastDFS {
    private static TrackerServer trackerServer = null;
    private static StorageServer storageServer = null;
    public static void main(String[] args) throws IOException, MyException {

        getStorageClient();
        fileUpload();
        fileDownload();
        fileDelete();
        closeFastDFS();
    }
    //抽取获取StorageClient的方法
    public static StorageClient getStorageClient() throws IOException, MyException {
        //1.加载配置文件,默认去classpath下加载
        ClientGlobal.init("fdfs_client.conf");
        //2.创建TrackerClient对象
        TrackerClient trackerClient = new TrackerClient();
        //3.创建TrackerServer对象
        trackerServer = trackerClient.getConnection();
        //4.创建StorageServler对象
        storageServer = trackerClient.getStoreStorage(trackerServer);
        //5.创建StorageClient对象,这个对象完成对文件的操作
        StorageClient storageClient = new StorageClient(trackerServer,storageServer);
        return storageClient;
    }
    //抽取关闭资源的方法
    public static void closeFastDFS() {
        if (storageServer != null) {
            try {
                storageServer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (trackerServer != null) {
            try {
                trackerServer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void fileUpload(){
        try {
            //1. 获取StorageClient对象
            StorageClient storageClient = getStorageClient();
            //2.上传文件  第一个参数:本地文件路径 第二个参数:上传文件的后缀 第三个参数:文件信息
            String [] uploadArray = storageClient.upload_file("D:/aa.txt","txt",null);
            for (String str:uploadArray) {
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            closeFastDFS();
        }
    }

    /**
     * group1
     * M00/00/00/wKgogGZajP6ADZGDAAAAG082hAE063.txt
     */

    //下载文件的方法
    public static void fileDownload(){
        try {
            //1. 获取StorageClient对象
            StorageClient storageClient = getStorageClient();
            //2.下载文件 返回0表示成功,其它均表示失败
            int num = storageClient.download_file("group1",
                    "M00/00/00/wKgogGZajP6ADZGDAAAAG082hAE063.txt","E:/bb.txt");
            System.out.println(num);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            closeFastDFS();
        }
    }
    //删除文件的方法
    public static void fileDelete(){
        try {
            //1. 获取StorageClient对象
            StorageClient storageClient = getStorageClient();
            //2.删除文件 返回0表示成功,其它均表示失败
            int num = storageClient.delete_file("group1",
                    "M00/00/00/wKgogGZajP6ADZGDAAAAG082hAE063.txt");
            System.out.println(num);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        } finally {
            closeFastDFS();
        }
    }
}

测试

  • 1. 启动带有Fastdfs模块的Nginx

    /usr/local/nginx_dfs/sbin/nginx -c /usr/local/nginx_dfs/conf/nginx.conf
    
  • 2. 重启或启动FastDFS服务进程

    fdfs_trackerd /etc/fdfs/tracker.conf restart
    
    fdfs_storaged /etc/fdfs/storage.conf restart
    • 如果storage启动失败,或者一直卡住,没有结果,排除了配置文件等一些明显的错误后,可能是网络问题,重启网络即可

  • 3、启动项目

    • 测试文件上传时,报如下错误,则需要关闭防火墙

结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 1.26.0 爆 HTTP/3 QUIC 漏洞,建议升级更新到 1.27.0

据悉&#xff0c;Nginx 1.25.0-1.26.0 主线版本中涉及四个与 NGINX HTTP/3 QUIC 模块相关的中级数据面 CVE 漏洞&#xff0c;其中三个为 DoS 攻击类型风险&#xff0c;一个为随机信息泄漏风险&#xff0c;影响皆为允许未经身份认证的用户通过构造请求实施攻击。目前已经紧急发布…

BurpSuite2024.5

1 工具介绍 本版本更新介绍 此版本引入了Burp Scanner对WebSockets的支持、对记录登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。 Burp Scanner 支持 WebSockets 我们已更新内部代理的配置以允许 WebSocket 流量。这使 Burp Scanner 现在可以抓取依赖 WebSo…

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

可视化小波频率如何影响地震纵向分辨率(MATLAB R2018A)

地震勘探主要通过地表接收的地震波场来识别地下的地质结构和物性参数等&#xff0c;获取地震数据的质量直接决定着反演地下信息的精确度和准确性。地震数据的分辨率是评价地震数据品质的重要标准之一&#xff0c;高分辨率的地震数据包含丰富的地质信息&#xff0c;更有利于进行…

快蜗牛OZON数据分析,OZON快蜗牛数据

在当今电商行业蓬勃发展的背景下&#xff0c;OZON作为俄罗斯及东欧市场的重要电商平台&#xff0c;其数据背后蕴藏着巨大的商业价值。快蜗牛&#xff0c;作为专注于OZON平台的数据分析工具&#xff0c;为卖家提供了深入的市场洞察和策略指导。接下来看看快蜗牛OZON数据分析&…

c基础 - 输入输出

目录 一.scanf() 和 printf() 函数 1.printf 2.scanf 二 . getchar() & putchar() 函数 1.int getchar(void) 2.int putchar(int c) 三. gets() & puts() 函数 一.scanf() 和 printf() 函数 #include <stdio.h> 需要引入头文件,stdio.h 1.printf print…

Nginx实战:日志打印自定义请求头

nginx的日志可以打印很多内容&#xff0c;但是有时候自定义的请求头该怎么打印呢&#xff1f;像下面这种场景&#xff1a; 其实很简单&#xff0c;设置日志打印格式log_format的时候&#xff0c;自定义的请求头用 【$http_自定义请求头名】 的格式就可以打印出来 例如你的自定义…

[机器学习] 低代码机器学习工具PyCaret库使用指北

PyCaret是一个开源、低代码Python机器学习库&#xff0c;能够自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具&#xff0c;极大地加快了实验周期&#xff0c;提高了工作效率。PyCaret本质上是围绕几个机器学习库和框架&#xff08;如scikit-learn、XGBoost、L…

文件夹损坏0字节:原因、恢复方案与预防措施

在使用电脑或移动设备时&#xff0c;我们有时会遇到文件夹突然损坏并显示为0字节的情况。这种故障不仅令人困惑&#xff0c;更可能导致重要数据的丢失。本文将深入探讨文件夹损坏0字节的现象&#xff0c;分析其产生的原因&#xff0c;并给出两种有效的数据恢复方案&#xff0c;…

2023年亚太杯A题:果园采摘机器人的图像识别,一二题

问题一&#xff1a;基于附件1中提供的可收获苹果的图像数据集&#xff0c;提取图像特征&#xff0c;建立数学模型&#xff0c;计算每幅图像中的苹果的数量&#xff0c;并绘制附件1中所有苹果的分布直方图。 对于自动采摘机器人&#xff0c;首要的能力就是识别出苹果对象&#…

CrossOver支持M4新品吗?苹果M4芯片对游戏支持的怎么样?

CrossOver是一款可以在不同平台之间无缝切换的软件&#xff0c;它可以让你在MacOS或者Linux操作系统上运行Windows应用程序&#xff0c;无需安装双系统或虚拟机。CrossOver是基于Wine项目开发的&#xff0c;Wine是一个可以在非Windows平台上运行Windows应用程序的兼容层。 那么…

doris实战处理(一)doris表的建表规范、查询

感谢原文&#xff1a;https://mp.weixin.qq.com/s/tGbdkF62WU6qbAH0mqtXuA 第一部分&#xff1a;字符集规范 【强制】数据库字符集指定utf-8&#xff0c;并且只支持utf-8。 命令规范 【建议】库名统一使用小写方式&#xff0c;中间用下划线&#xff08;_&#xff09;分割&a…

使用第三方工具percona-xtrabackup进行数据备份与恢复

目录 准备工作 开始安装 innobackupex的使用 完全备份 增量备份 数据恢复 本次需要用到的软件 mysql 5.7.35percona-xtrabackup-24-2.4.8 ps&#xff1a;---MySQL必须是5.7的版本&#xff0c;在8.0之后已经不支持 percona-xtrabackup-24 系统版本CentOS7.9 准备工作 …

基于tensorflow和NasNet的皮肤癌分类项目

数据来源 https://challenge.isic-archive.com/data/#2019 数据划分 写了个脚本划分 for line in open(ISIC/labels.csv).readlines()[1:]:split_line line.split(,)img_file split_line[0]benign_malign split_line[1]# 0.8 for train, 0.1 for test, 0.1 for validati…

前端Vue自定义带加减按钮的数字输入框组件的设计与实现

随着前端技术的不断发展&#xff0c;开发的复杂度日益提升。传统的整块应用开发方式在面对小改动或小功能增加时&#xff0c;常常需要修改大量代码&#xff0c;导致整个系统的逻辑受到影响。为了解决这个问题&#xff0c;组件化开发成为了前端开发的必然趋势。 一、组件化开发…

【Python系列】Python 元组(Tuple)详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

springboot结合mybatis使用多数据源的方式

背景 最近有一个需求&#xff0c;有两个库需要做同步数据&#xff0c;一个Doris库&#xff0c;一个mysql库&#xff0c;两边的表结构一致&#xff0c;这里不能使用navicat等工具提供的数据传输之类的功能&#xff0c;只能使用代码做同步&#xff0c;springboot配置多数据…

乐高小人分类项目

数据来源 LEGO Minifigures | Kaggle 建立文件目录 BASE_DIR lego/star-wars-images/ names [YODA, LUKE SKYWALKER, R2-D2, MACE WINDU, GENERAL GRIEVOUS ] tf.random.set_seed(1)# Read information about dataset if not os.path.isdir(BASE_DIR train/):for name in …

GPT-4o:新一代人工智能技术的全方位解析引言

目录 &#x1f40b;引言 &#x1f40b;梳理 GPT 各版本之间的内容 &#x1f988;GPT-1&#xff1a;开创性的起点 &#x1f988; GPT-2&#xff1a;参数规模的大幅提升 &#x1f988; GPT-3&#xff1a;参数爆炸与多任务学习 &#x1f988;GPT-4&#xff1a;进一步提升的智…

嵌入式模块学习小记(未分类)

L298N电机驱动板模块 Output A&#xff1a;接DC 电机 1 或步进电机的 A和 A-&#xff1b; Output B&#xff1a;接DC 电机 2 或步进电机的 B和 B-&#xff1b; 5V Enable&#xff1a;如果使用输入电源大于12V的电源&#xff0c;请将跳线帽移除。输入电源小于12V时短接可以提…