文章目录


    一 : 添加配置文件

    二 : 加载配置文件

        1. 测试加载配置文件

        2. 输出配置文件

    三:功能实现

        1.初始化连接信息

        2.上传文件

        3.下载文件

        4.获取元数据信息

        5.获取文件信息

        6.删除文件




在上一篇的文章中已经整合了Nginx和FastDFS : FastDFS安装和配置,整合Nginx-1.13.3

今天使用Java代码实现文件的上传和下载。对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中。或者在Maven项目pom.xml文件中添加依赖

<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>



### 一 : 添加配置文件
当完成以上操作之后可以添加链接FastDFS服务器的配置文件 **fastdfs-client.properties**

fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 192.168.1.7:22122

因为项目中只使用properties 格式文件,如果需要更多的配置信息,可以查看官方的配置信息

: 1. 其他的配置项为可选,fastdfs.tracker_servers 为必须选项

     2. 多个tracker_servers可以使用逗号“ , ”分隔



### 二 : 加载配置文件

1. 测试加载配置文件

@Test
public void initConifg() throws Exception {
// 加载配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
System.out.println("ClientGlobal.configInfo():" + ClientGlobal.configInfo());
}

2. 输出结果

ClientGlobal.configInfo():{
g_connect_timeout(ms) = 5000
g_network_timeout(ms) = 30000
g_charset = UTF-8
g_anti_steal_token = false
g_secret_key = FastDFS1234567890
g_tracker_http_port = 80
trackerServers = 192.168.1.7:22122
}

当出现上面和配置文件一致的输出结果时候,说明加载配置文件已经成功。


三:功能实现

由于是使用Junit做测试,为了方便在开始执行之前,初始化配置文件和获取连接,同时没有捕获异常全部抛出

1.初始化连接信息

//成员变量
TrackerServer trackerServer = null;
StorageServer storageServer = null;
StorageClient storageClient = null;
/**
* 初始化连接信息
* @author: wrh45
* @date: 2017年8月5日下午8:08:57
*/
@Before
public void init() throws Exception {
// 加载配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
// 获取连接
TrackerClient trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageClient = new StorageClient(trackerServer, storageServer);
}

:    如果出现连接超时异常:java.net.SocketTimeoutException: connect timed out

     1 .查看服务器地址和端口是否正确

​     2 .请查看服务器TrackerServer和StorageServer服务端口是否开启。默认为22122和23000



#### 2.上传文件

/**
* 上传图片
* @throws Exception
* @author: wrh45
* @date: 2017年8月5日下午7:09:23
*/
@Test
public void uploadFileOfByte() throws Exception {
// 获取文件字节信息
file = new File("src/test/resources/pic/Ace.jpg");
FileInputStream inputStream = new FileInputStream(file);
byte[] file_buff = new byte[(int) file.length()];
inputStream.read(file_buff); // 获取文件扩展名
String fileName = file.getName();
String extName = null;
if (fileName.contains(".")) {
extName = fileName.substring(fileName.lastIndexOf(".") + 1);
} else {
return;
} // 图片元数据,如果设置为空,那么服务器上不会生成-m的原数据文件
NameValuePair[] meta_list = new NameValuePair[2];
meta_list[0] = new NameValuePair("fileName", "测试专用");
meta_list[1] = new NameValuePair("length", "测试专用");
// 文件上传,返回组名和访问地址
String[] upload_file = storageClient.upload_file(file_buff, extName, meta_list);
System.out.println(Arrays.asList(upload_file));
}

下面是执行结果

已经将图片上传到服务器,同时返回了图片地址。那么通过这个地址试试能否访问

OK,在浏览器输入地址后,成功返回了图片信息


3.下载文件

这里通过storageClient下载文件,然后将数据存储到本地。如果通过浏览器下载,同理将数据写入文件即可

/**
* 下载图片
* @throws Exception
* @author: wrh45
* @date: 2017年8月5日下午8:09:10
*/
@Test
public void downLoadFile() throws Exception {
// 下载文件,返回字节数组
byte[] file_buff = storageClient.download_file("group1", "M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg");
// 将数据写文件中
File file = new File("src/test/resources/pic/Ace2.jpg");
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(file_buff);
outStream.flush();
outStream.close();
}

下面是执行结果,不出意外是可以成功执行的




4.获取元数据信息

/**
* 元数据信息
* @throws Exception
* @author: wrh45
* @date: 2017年8月5日下午8:09:38
*/
@Test
public void metaData() throws Exception {
// 上传图片的时候,元数据若为空将无法生存-m的原数据文件。获取时候此处将抛出NullPointerException
NameValuePair[] get_metadata = storageClient.get_metadata("group1",
"M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg");
for (NameValuePair nameValuePair: get_metadata) {
System.out.println("name: " + nameValuePair.getName() + " value: " + nameValuePair.getValue());
}
}

以下是执行结果,获取到的数据和上传的数据一样

name: fileName  value: 测试专用
name: length value: 测试专用



#### 5.获取文件信息

/**
* 获取文件信息
* @author: wrh45
* @date: 2017年8月7日下午9:02:47
*/
@Test
public void getFileInfo() throws Exception {
FileInfo fileInfo = storageClient.get_file_info("group1", "M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg"); System.out.println("CRC32签名:" + fileInfo.getCrc32());
System.out.println("文件大小:" + fileInfo.getFileSize());
System.out.println("服务器地址:" + fileInfo.getSourceIpAddr());
System.out.println("创建时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(fileInfo.getCreateTimestamp()));
}

输出结果

CRC32签名:-1995498431
文件大小:369781
服务器地址:192.168.1.7
创建时间:2017-08-07 20-24-56



#### 6.删除文件

当数据测试完整之后,试试能否删除吧

/**
* 删除文件
* @throws Exception
* @author: wrh45
* @date: 2017年8月7日下午9:10:04
*/
@Test
public void deleteFile() throws Exception {
// 返回0成功,否则返回错误吗
int code = storageClient.delete_file("group1", "M00/00/00/wKgBB1l-EwyAGvxuAAWkdYkPHEE854.jpg");
System.out.println(code);
}

删除之后输出结果为0,如果出现非0结果,那么返回的是错误代码

以上是Java实现上传下载等功能的代码,如果需要可以封装成工具类使用。

以下是个人封装好的工具类

/**
* 上传文件工具类
* @ClassName: FileUploadUtils
* @author wrh45
* @date 2017年8月8日下午4:14:31
*/
public class FileUploadUtils {
private static TrackerClient trackerClient = null;
private static TrackerServer trackerServer = null;
private static StorageServer storageServer = null;
private static StorageClient storageClient = null;
private static final String groupName = "group1"; static {
// 加载配置文件
try {
ClientGlobal.initByProperties("config/fastdfs-client.properties");
// System.out.println("ClientGlobal.configInfo():" +
// ClientGlobal.configInfo());
} catch (IOException | MyException e) {
e.printStackTrace();
System.out.println("load config file fail");
}
} /*
* 初始化连接数据
*/
private static void init() {
try {
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageClient = new StorageClient(trackerServer, storageServer);
} catch (IOException e) {
e.printStackTrace();
System.out.println("init fail");
}
} /**
* 上传文件
* @param filePath 文件路径
* @param fileName 文件名称
* @return 文件存储信息
* @author: wrh45
* @date: 2017年8月5日下午11:10:38
*/
public static String[] uploadFile(String filePath, String fileName) {
return uploadFile(null, filePath, fileName);
} /**
* 上传文件
* @param fileBuff 文件字节数组
* @param fileName 文件名称
* @return 文件存储信息
* @author: wrh45
* @date: 2017年8月5日下午11:10:38
*/
public static String[] uploadFile(byte[] fileBuff, String fileName) {
return uploadFile(fileBuff, null, fileName);
} /**
* 上传文件
* @param file_buff 文件字节数组
* @param filePath 文件路径
* @param fileName 文件名称
* @return 文件存储信息
* @author: wrh45
* @date: 2017年8月5日下午10:58:19
*/
private static String[] uploadFile(byte[] fileBuff, String filePath, String fileName) {
try {
if (fileBuff == null && filePath == null) {
return new String[0];
}
// 初始化数据
if (storageClient == null) {
init();
} // 获取文件扩展名称
String fileExtName = "";
if (fileName != null && !"".equals(fileName) && fileName.contains(".")) {
fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);
} else {
return new String[0];
} // 设置图片元数据
NameValuePair[] metaList = new NameValuePair[3];
metaList[0] = new NameValuePair("fileName", fileName);
metaList[1] = new NameValuePair("fileExtName", fileExtName);
metaList[2] = new NameValuePair("fileSize", String.valueOf(fileBuff.length));
// 上传文件
String[] uploadFile = null;
if (fileBuff != null && filePath == null) {
if (fileBuff.length == 0) {
return new String[0];
}
uploadFile = storageClient.upload_file(fileBuff, fileExtName, metaList);
} else {
//路径匹配Windown和Linux
if ("".equals(filePath) || !(filePath.matches("^[a-zA-Z]:{1}([\u4e00-\u9fa5\\w/_\\\\-]+)$") || filePath.matches("^(/[\u4e00-\u9fa5\\w_-]+)+$"))) {
return new String[0];
}
uploadFile = storageClient.upload_file(filePath, fileExtName, metaList);
}
return uploadFile == null ? new String[0] : uploadFile;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (trackerServer != null) {
trackerServer.close();
trackerServer = null;
}
if (storageServer != null) {
storageServer.close();
storageServer = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return new String[0];
} /**
* 删除服务器文件
* @param remoteFileName 文件在服务器中名称
* @author: wrh45
* @date: 2017年8月6日上午12:15:22
*/
public static int deleteFile(String remoteFileName) {
try {
if (remoteFileName == null || "".equals(remoteFileName) || !remoteFileName.contains(groupName)) {
return -1;
}
if (storageClient == null) {
init();
}
String fileURL = remoteFileName.substring(remoteFileName.indexOf(groupName));
String group = fileURL.substring(0, remoteFileName.indexOf("/") + 1);
String fileName = fileURL.substring(remoteFileName.indexOf("/") + 2);
int code = storageClient.delete_file(group, fileName);
return code;
} catch (Exception e) {
e.printStackTrace();
System.out.println("The File Delete Fail");
}
return -1;
} /**
* 获取文件信息
* @param groupName 组名
* @param remoteFilename 远程文件名
* @return
* @author: wrh45
* @date: 2017年8月8日上午12:25:26
*/
public static FileInfo getFileInfo(String groupName, String remoteFilename) {
try {
if (storageClient == null) {
init();
}
FileInfo fileInfo = storageClient.get_file_info(groupName, remoteFilename);
return fileInfo;
} catch (Exception e) {
e.printStackTrace();
System.out.println("Get File Info Fail");
}
return null;
}
}

整篇博文到此为止,不足之处请多多指正。

FasfDFS整合Java实现文件上传下载的更多相关文章

  1. FasfDFS整合Java实现文件上传下载功能实例详解

    https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...

  2. CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  3. java实现文件上传下载

    喜欢的朋友可以关注下,粉丝也缺. 今天发现已经有很久没有给大家分享一篇技术文章了,于是想了一下给大家分享一篇java实现文件上传下载功能的文章,不喜欢的希望大家勿喷. 想必大家都知道文件的上传前端页面 ...

  4. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构:

  5. java+大文件上传下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  6. Java web文件上传下载

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52048666 作者:朱培 ID:sdksdk0 邮 ...

  7. java 实现文件上传下载以及查看

    项目的目录结构 代码  IOUtils.java package cn.edu.zyt.util; import java.io.IOException; import java.io.InputSt ...

  8. Jsch - java SFTP 文件上传下载

    使用Jsch上传.下载文件,核心步骤是:获取channel,然后使用get/put方法下载.上传文件 核心代码句: session = jSch.getSession(ftpUserName, ftp ...

  9. java blob 文件上传下载

    1.文件上传 pojo中为byte[] 类型,数据库中对应为blob类型. 主要代码: FileInputStream fis = null; fis = new FileInputStream(ne ...

随机推荐

  1. 浅谈js中的正则表达式

    很多时候多会被正则表达式搞的晕头转向,最近抽出时间对正则表达式进行了系统的学习,整理如下: 正则表达式的创建 两种方法,一种是直接写,由包含在斜杠之间的模式组成:另一种是调用RegExp对象的构造函数 ...

  2. Flash TextField selectable bug block TextEvent.Link solution

    There is an old version Felx SDK bug(in my case it's Flex SDK v3.3.0.4852) that when TextField.selec ...

  3. loadrunner 手工参数拼接与l oadrunner的url编码

    Acction() { //演示需要的一些变量,提前声明 char *name = "yezi_zh"; "; char *work = "engin" ...

  4. Entity Framework入门教程:创建实体数据模型

    下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...

  5. csv导入数据到mysql

    csv表中含有中文字符,具体实现代码示例: load data infile 'C:\\Users\\Administrator\\Desktop\\import\\CELLutf.csv' into ...

  6. cURL模拟网页登陆

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/7/13 * Time: 23:15 */ $data=' ...

  7. [leetcode-583-Delete Operation for Two Strings]

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  8. video+ audio

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. Python爬虫学习之爬美女图片

    最近看机器学习挺火的,然后,想要借助业余时间,来学习Python,希望能为来年找一份比较好的工作. 首先,学习得要有动力,动力,从哪里来呢?肯定是从日常需求之中来.我学Python看网上介绍.能通过P ...

  10. Tomcat学习笔记(一)一个简单的Web服务器

    内容为<深入剖析Tomcat>第一章重点,以及自己的总结,如有描述不清的,可查看原书. 一.HTTP协议: 1.定义:用于服务器与客户端的通讯的协议,允许web服务器和浏览器通过互联网进行 ...