使用Spring Boot集成FastDFS的示例代码
程序员文章站
2023-11-04 20:43:04
这篇文章我们介绍如何使用spring boot将文件上传到分布式文件系统fastdfs中。
这个项目会在上一个项目的基础上进行构建。
1、pom包配置
我们使用spr...
这篇文章我们介绍如何使用spring boot将文件上传到分布式文件系统fastdfs中。
这个项目会在上一个项目的基础上进行构建。
1、pom包配置
我们使用spring boot最新版本1.5.9、jdk使用1.8、tomcat8.0。
<dependency> <groupid>org.csource</groupid> <artifactid>fastdfs-client-java</artifactid> <version>1.27-snapshot</version> </dependency>
加入了fastdfs-client-java包,用来调用fastdfs相关的api。
2、配置文件
resources目录下添加fdfs_client.conf文件
connect_timeout = 60 network_timeout = 60 charset = utf-8 http.tracker_http_port = 8080 http.anti_steal_token = no http.secret_key = 123456 tracker_server = 192.168.53.85:22122 tracker_server = 192.168.53.86:22122
配置文件设置了连接的超时时间,编码格式以及tracker_server地址等信息
详细内容参考:
3、封装fastdfs上传工具类
封装fastdfsfile,文件基础信息包括文件名、内容、文件类型、作者等。
public class fastdfsfile { private string name; private byte[] content; private string ext; private string md5; private string author; //省略getter、setter
封装fastdfsclient类,包含常用的上传、下载、删除等方法。
首先在类加载的时候读取相应的配置信息,并进行初始化。
static { try { string filepath = new classpathresource("fdfs_client.conf").getfile().getabsolutepath();; clientglobal.init(filepath); trackerclient = new trackerclient(); trackerserver = trackerclient.getconnection(); storageserver = trackerclient.getstorestorage(trackerserver); } catch (exception e) { logger.error("fastdfs client init fail!",e); } }
文件上传
public static string[] upload(fastdfsfile file) { logger.info("file name: " + file.getname() + "file length:" + file.getcontent().length); namevaluepair[] meta_list = new namevaluepair[1]; meta_list[0] = new namevaluepair("author", file.getauthor()); long starttime = system.currenttimemillis(); string[] uploadresults = null; try { storageclient = new storageclient(trackerserver, storageserver); uploadresults = storageclient.upload_file(file.getcontent(), file.getext(), meta_list); } catch (ioexception e) { logger.error("io exception when uploadind the file:" + file.getname(), e); } catch (exception e) { logger.error("non io exception when uploadind the file:" + file.getname(), e); } logger.info("upload_file time used:" + (system.currenttimemillis() - starttime) + " ms"); if (uploadresults == null) { logger.error("upload file fail, error code:" + storageclient.geterrorcode()); } string groupname = uploadresults[0]; string remotefilename = uploadresults[1]; logger.info("upload file successfully!!!" + "group_name:" + groupname + ", remotefilename:" + " " + remotefilename); return uploadresults; }
使用fastdfs提供的客户端storageclient来进行文件上传,最后将上传结果返回。
根据groupname和文件名获取文件信息。
public static fileinfo getfile(string groupname, string remotefilename) { try { storageclient = new storageclient(trackerserver, storageserver); return storageclient.get_file_info(groupname, remotefilename); } catch (ioexception e) { logger.error("io exception: get file from fast dfs failed", e); } catch (exception e) { logger.error("non io exception: get file from fast dfs failed", e); } return null; }
下载文件
public static inputstream downfile(string groupname, string remotefilename) { try { storageclient = new storageclient(trackerserver, storageserver); byte[] filebyte = storageclient.download_file(groupname, remotefilename); inputstream ins = new bytearrayinputstream(filebyte); return ins; } catch (ioexception e) { logger.error("io exception: get file from fast dfs failed", e); } catch (exception e) { logger.error("non io exception: get file from fast dfs failed", e); } return null; }
删除文件
public static void deletefile(string groupname, string remotefilename) throws exception { storageclient = new storageclient(trackerserver, storageserver); int i = storageclient.delete_file(groupname, remotefilename); logger.info("delete file successfully!!!" + i); }
使用fastdfs时,直接调用fastdfsclient对应的方法即可。
4、编写上传控制类
从multipartfile中读取文件信息,然后使用fastdfsclient将文件上传到fastdfs集群中。
public string savefile(multipartfile multipartfile) throws ioexception { string[] fileabsolutepath={}; string filename=multipartfile.getoriginalfilename(); string ext = filename.substring(filename.lastindexof(".") + 1); byte[] file_buff = null; inputstream inputstream=multipartfile.getinputstream(); if(inputstream!=null){ int len1 = inputstream.available(); file_buff = new byte[len1]; inputstream.read(file_buff); } inputstream.close(); fastdfsfile file = new fastdfsfile(filename, file_buff, ext); try { fileabsolutepath = fastdfsclient.upload(file); //upload to fastdfs } catch (exception e) { logger.error("upload file exception!",e); } if (fileabsolutepath==null) { logger.error("upload file failed,please upload again!"); } string path=fastdfsclient.gettrackerurl()+fileabsolutepath[0]+ "/"+fileabsolutepath[1]; return path; }
请求控制,调用上面方法savefile()。
@postmapping("/upload") //new annotation since 4.3 public string singlefileupload(@requestparam("file") multipartfile file, redirectattributes redirectattributes) { if (file.isempty()) { redirectattributes.addflashattribute("message", "please select a file to upload"); return "redirect:uploadstatus"; } try { // get the file and save it somewhere string path=savefile(file); redirectattributes.addflashattribute("message", "you successfully uploaded '" + file.getoriginalfilename() + "'"); redirectattributes.addflashattribute("path", "file path url '" + path + "'"); } catch (exception e) { logger.error("upload file failed",e); } return "redirect:/uploadstatus"; }
上传成功之后,将文件的路径展示到页面,效果图如下:
在浏览器中访问此url,可以看到成功通过fastdfs展示:
这样使用spring boot 集成fastdfs的案例就完成了。
示例代码-
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
使用Spring Boot集成FastDFS的示例代码
-
Spring Boot中使用RSocket的示例代码
-
Spring Boot集成Mybatis的实例代码(简洁版)
-
spring boot拦截器的使用场景示例详解
-
Spring Boot加密配置文件特殊内容的示例代码详解
-
Spring Boot集成X-admin2.2时,使用layui的字体图标时无法正常显示或乱码的解决办法
-
Spring Boot集成X-admin2.2时,使用layui的字体图标时无法正常显示或乱码的解决办法
-
spring中使用mybatis实现批量插入的示例代码
-
使用Docker部署Spring Boot的应用示例
-
Spring Boot使用Allatori代码混淆的方法