欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Spring Boot集成FastDFS的示例代码

程序员文章站 2023-12-03 10:00:10
这篇文章我们介绍如何使用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";
}

上传成功之后,将文件的路径展示到页面,效果图如下:

使用Spring Boot集成FastDFS的示例代码

在浏览器中访问此url,可以看到成功通过fastdfs展示:

使用Spring Boot集成FastDFS的示例代码

这样使用spring boot 集成fastdfs的案例就完成了。

示例代码-

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。