FasfDFS整合Java实现文件上传下载功能实例详解
在上篇文章给大家介绍了fastdfs安装和配置整合nginx-1.13.3的方法,大家可以点击查看下。
今天使用java代码实现文件的上传和下载。对此作者提供了java api支持,下载将源码添加到项目中。或者在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实现文件上传下载功能实例详解,希望对大家有所帮助
推荐阅读
-
FasfDFS整合Java实现文件上传下载功能实例详解
-
实例详解Ajax 之FileUpload和Struts2实现多文件上传功能
-
Socket+JDBC+IO实现Java文件上传下载器DEMO详解
-
java开发之spring webflow实现上传单个文件及多个文件功能实例
-
Java利用apache ftp工具实现文件上传下载和删除功能
-
Java利用apache ftp工具实现文件上传下载和删除功能
-
Java基于外观模式实现美食天下食谱功能实例详解
-
Java实现的文件上传下载工具类完整实例【上传文件自动命名】
-
基于Java文件输入输出流实现文件上传下载功能
-
Java基于享元模式实现五子棋游戏功能实例详解