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

org.csource

fastdfs-client-java

1.27-SNAPSHOT

一 : 添加配置文件

当完成以上操作之后可以添加链接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实现文件上传下载功能实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解相关推荐

  1. JavaWeb实现文件上传下载功能实例详解

    感谢原文作者分享,原文链接:http://www.jb51.net/article/96745.htm 这篇文章主要介绍了JavaWeb中的文件上传和下载功能的实现,在开发中,文件上传和下载功能是非常 ...

  2. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  3. php 使用上传文件预览插件,bootstrap fileinput插件实现预览上传照片功能方法详解...

    本文主要介绍了bootstrap fileinput插件实现预览上传照片功能,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友可以参考下,希望能帮助到大家. 效果图如下所示: 具体代码如下: cl ...

  4. java 微信企业号上传文件_微信企业号上传下载多媒体文件接口详解演示-java

    讲完这篇博客,微信企业号的接口就说完了,下载了我源码的童鞋都知道,里面的备注很详细,但凡看过几遍就都会自己开发了,我说的这些接口至此我已经全部开发完了,剩下的就是你们自己写功能了,都是轻而易举的事情了 ...

  5. SpringMVC Web实现文件上传下载功能实例解析

    需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...

  6. php webwxuploadmedia_PHP Web实现文件上传下载功能实例解析

    PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...

  7. B/S实现文件上传下载功能实例解析

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  8. java歌曲上传下载功能实现,Java上传下载功能的实现详解

    上传下载是很简单的功能,但是每次用的时候还是要查,这里整理一下 前台: 提交 主要注意: enctype="multipart/form-data" method="po ...

  9. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

最新文章

  1. jQuery源码-jQuery.fn.each jQuery.each
  2. Huggingface BERT源码详解:应用模型与训练优化
  3. shell中用bc进行浮点运算(转帖)
  4. python报考软考哪个比较好_软考高级考哪个好?哪个比较热门?
  5. OS + Linux RedHat 7 / redhat 7 configuration
  6. Unity3D的几种坐标系
  7. 新疆大学c语言期末考试题库,2016年新疆师范大学教育科学学院C语言程序设计考研复试题库...
  8. 截取文件最后10行_10 行 Python 代码自动清理电脑内重复文件,解放双手
  9. Python Imaging Library: ImageSequence Module(图像序列模块)
  10. python怎么爬取知乎回答并制作词云_爬虫|爬取微博动态
  11. Python自学笔记-lambda函数(来自廖雪峰的官网Python3)
  12. 第五章 字符串字面量---一个特殊的数组
  13. LRC软件测试简历,C语言 LRC歌词文件解析
  14. Objective-C 与 C++ 的区别
  15. Ubuntu 20.04换阿里源
  16. sh: /node_modules/.bin/vue-cli-service: Permission denied
  17. 分享一个简单、便宜配置https安全证书的方法(10元/年)
  18. Android Navigation与BottomNavigationView实现底部导航栏
  19. 斗罗大陆壁纸图片高清小舞146集八段摔杨无敌
  20. Walletry for mac(日常支出跟踪工具)

热门文章

  1. mysql got error 5 during_更新表数据,或者复制数据到新表出现这样问题ERROR 1180 (HY000): Got error 5 during COMMIT...
  2. 电子台账:教程目录及软件下载
  3. 树莓派系列-6-Qt控制树莓派GPIO(3B V1.2)
  4. 微信授权登录(OAuth2.0)-- 随记
  5. 【linux】循序渐进学运维-基础篇-分区命令fdisk
  6. 唐山劳动技师有计算机专业,唐山劳动技师等级技术学院
  7. ad域帐号登录提示无法处理请求_面试官:来说说单点登录的三种实现方式
  8. 12 -- OpenCV学习—边缘检测
  9. python画糖果_币乎糖果空投算法解析(python)-2
  10. 11.2 22大数据c语言自测3题解