FastDFS文件的上传和下载
一、FastDFS概述:
FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、下载)等,解决了大容量存储和负载均衡的问题,高度追求高性能和扩展性。特别适合以文件为载体的在线服务,如相册万盏、视频网站等等。
FastDFS是由纯C语言实现,支持Linux,FreeBSD的NUIX系统。类google FS,不是通用的文件系统,只能够同故宫转悠API进行访问,目前提供了C,Java,PHP API。另外,FastDFS可以看作是基于文件的key-Value存储系统,也可以称之为 分布式文件存储服务。
二、FastDFS提供的功能:
1、upload 上传文件
2、upload_appender:上传appender文件,后续可已对其进行append操作
3、upload_slave:上传从文件
4、download 下载文件
5、delete 删除文件
6、append:在已有文件后追加内容
7、set_metadata:设置文件附加属性
8、get_metadata:获取文件附加属性
三、FastDFS的特点:
1、分组存储、灵活简洁
2、对等结构、不存在单点
3、文件ID有FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server
4、和流行的web server无缝连接,FastDFS已提供apache和nginx扩展模块
5、大、中、小文件均可以很好支持,支持海量小文件存储
6、支持多块磁盘,支持但盘数据恢复
7、支持相同文件内容只保存一份,节省存储空间
8、存储服务器上可以保存文件附加属性
9、下载文件支持多线程方式、支持断点续传
四、FastDFS架构解读:
1、只有两个角色,tracker server和storage server,不需要存储文件索引信息
2、所有服务器都是对等的,不存在Master-Slave关系
3、存储服务器采用分组方式,同组内存储服务器上的文件完全相同
4、不同组的storage server之间不会相互通信
5、不同组的storage server之间不会相互通信
6、有storage server主动向tracker server报告状态信息,tracker server 之间通常不会相互通信
五、FastDFS如何解决同步延迟问题?
1、storage生成的文件名中,包含源头storage IP地址和文件创建的时间戳
2、源头storage定时向tracker报告同步情况,包括向目标服务器同步到的文件时间戳
3、tracker收到storage的同步报告后,找出该组内每台storage被同步到的时间戳(取最小值),作为storage属性保存到内存中
六、FastDFS扩展模块要点:
1、使用扩展模块来解决文件同步延迟问题
2、对每台storage server上部署web server,直接对外提供HTTP服务
3、tracker server上不需要部署web server
4、如果请求文件在当前storage上不存在,通过文件ID反解出源storage,直接请求源storage
5、目前已提供apache和nginx扩展模块
6、FastDFS扩展模块不依赖于FastDFS server,可以独立存在
七、FastDFS扩展模块特性:
1、仅支持HTTP HEAD和GET
2、支持token方式的防盗链(缺省是关闭的)
-ts:生成token的时间(unix时间戳)
-token:32未得token字符串(md5签名)
3、支持制定保存的缺省文件名,URL参数名为filename
4、支持断点续传
FastDFS使用流程介绍:
三、实现流程:
1、配置依赖:因为我们使用的maven来管理工程,所以,我们需要去陪pom文件
<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.leech</groupId>
<artifactId>fastdfs-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>fastdfs-demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.25</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
2、新建fdfs_client.conf文件,在我们的itoo中,我们建立在(src/main/resources底下)
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
#没什么用
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.17.112:22122
#tracker_server = 192.168.0.119:22122
3、实现文件上传:
public void save(HttpServletRequest request,HttpServletResponse response){
String videoName=request.getParameter("videoName");
String videoType=request.getParameter("videoType");
String videoDesc=request.getParameter("videoDesc");
String videoPath=request.getParameter("videoPath");
String picturePath=request.getParameter("picturePath"); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date uploadTime=null;
try {
uploadTime = formatter.parse(formatter.format(new Date()));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil (); String dataBaseName = "itoo_video"; Video video=new Video();
video.setUserName("why");
video.setUserID("why");
video.setVideoName(videoName);
video.setVideoPath(videoPath);
video.setVideoType(videoType);
video.setVideoDesc(videoDesc);
video.setDataBaseName(dataBaseName);
video.setPicturePath(picturePath);
video.setUploadTime(uploadTime); uploadFileService.save(video); jackJsonUtil.beanToJson(response,video); } /*
* 上传文件
*/
@RequestMapping(value={"/upload"})
@ResponseBody
public void upload( MultipartFile file, HttpServletRequest request,HttpServletResponse response){ String ext_Name = file.getOriginalFilename().split("\\.")[1];
String videoName=file.getOriginalFilename().split("\\.")[0]; byte[] bytes = null;
try {
bytes = file.getBytes();
} catch (IOException e) {
e.printStackTrace();
}
String videoPath=uploadFile(bytes,ext_Name); JacksonJsonUntil jackJsonUtil =new JacksonJsonUntil (); Video video=new Video();
video.setVideoPath(videoPath);
video.setVideoName(videoName); jackJsonUtil.beanToJson(response,video);
} public String uploadFile(byte[] byteFile, String ext_file) {
// 拼接服务区的文件路径
StringBuffer sbPath = new StringBuffer();
sbPath.append("http://192.168.22.252");
try {
// 初始化文件资源
ClientGlobal
.init("C:\\Users\\alsr\\Desktop\\ITOO-5.0\\itoo-video-Test\\dmsd-itoo-video-parent\\dmsd-itoo-video-web\\src\\main\\resources\\fdfs_client.conf"); // 链接FastDFS服务器,创建tracker和Stroage
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
//利用字节流上传文件
String[] strings = storageClient.upload_file(byteFile, ext_file, null); for (String string : strings) {
sbPath.append("/" + string);
System.out.println(string);
}
// 全路径
System.out.println(sbPath);
} catch (IOException | MyException e) {
e.printStackTrace();
}
return sbPath.toString();
}
只要我们能正常接收到一个json类型的字符串(url地址),就证明我们已经上传成功了,如果不信,可以直接用浏览器去验证一下,看看能不能得到文件展示。
4、FastDFS实现文件下载:
public void testDownload() {
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
System.out.println(b);
IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));
}
catch (Exception e) {
e.printStackTrace();
}
}
5、FastDFS获取将上传文件信息:
public void testGetFileInfo(){
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
System.out.println(fi.getSourceIpAddr()); System.out.println(fi.getFileSize());
System.out.println(fi.getCreateTimestamp()); System.out.println(fi.getCrc32());
}
catch (Exception e) {
e.printStackTrace();
}
}
6、FastDFS获取文件名称:
public void testGetFileMate(){
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,
storageServer);
NameValuePair nvps [] = storageClient.get_metadata("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
for(NameValuePair nvp : nvps){
System.out.println(nvp.getName() + ":" + nvp.getValue());
}
}
catch (Exception e) {
e.printStackTrace();
}
}
7、FastDFS实现删除文件:
public void testDelete(){
try {
ClientGlobal.init(conf_filename);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,storageServer);
int i = storageClient.delete_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf");
System.out.println( i==0 ? "删除成功" : "删除失败:"+i);
}
catch (Exception e) {
e.printStackTrace();
}
}
FastDFS文件的上传和下载的更多相关文章
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
- Apache FtpServer 实现文件的上传和下载
1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...
- 初学Java Web(7)——文件的上传和下载
文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...
- java web(四):request、response一些用法和文件的上传和下载
上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...
- 黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载
黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数 ...
随机推荐
- layout_weight属性分析
最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个能够说的清楚的,于是自己结合网上资料研究了一下,终于迎刃而解,写出 ...
- oracle11gR2、client及plsql完整安装与配置
本文主要介绍Oracle11g,client及PLSQL的安装过程 一,oracle安装 安装环境:虚拟机win7 64 1.点击目录中 setup.exe文件 2.配置安全更新中,取消通过my or ...
- JDK安装错误问题总结。
Windows10安装JDK,测试java -version时出现could not open XXX\jvm.cfg的解决方法. 1. 切记,环境变量修改后重新测试时一定要关闭命令再重新打开才生效 ...
- LuoguP2378 因式分解II 题解
Content 输入一个多项式 \(x^2+ax+b\)(不保证 \(a,b\neq0\)),请对这个多项式进行因式分解(形式为 \((x-x_1)(x-x_2)\),其中 \(x_1>x_2\ ...
- mysql联合查询更新数据库例子
mysql联合查询更新数据库例子,用户表,部门表,把用户表中的部门属性更新为部门表的主键UPDATE user_table AS utINNER JOIN belongdept AS bd ON bd ...
- MySQL 定时器
mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表:create table mytable (id int auto_increment ...
- Raft成员变化(Membership Change)
我司高产作家唐刘老师的小猪佩奇版"深入浅出 Raft"第四弹来啦~~前几篇内容戳这里 ↓ 在猪爸爸的努力下,泥坑银行终于能高效正常的运作了,但猪爸爸一直比较担心海盗岛那边的网点,因 ...
- JAVA使用经纬度通过腾讯地图API获取详细地址
官方文档:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder package com.weixin.map; ...
- FilesCodingConvert--批量文件编码格式转换工具
FilesCodingConvert–批量文件编码格式转换工具 简介 最近开始学习使用Android Studio,因为它的方便易用,我打算以后就不在使用ADT的方式编写Android项目了.当从Ec ...
- 【剑指Offer】反转链表 解题报告(Python)
[剑指Offer]反转链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...