专栏名称: 纯洁的微笑
分享微服务实践与Java技术干货、偶尔讲讲故事。在人工智能的时代,一起学习微服务架构演进和大数据治理。
目录
相关文章推荐
程序猿  ·  微信+DeepSeek来了! ·  2 天前  
昆明信息港  ·  大跳水!暴跌77%! ·  2 天前  
程序员小灰  ·  DeepSeek 被放弃了,阿里牛逼!!! ·  4 天前  
51好读  ›  专栏  ›  纯洁的微笑

Spring Boot(十八):使用 Spring Boot 集成 FastDFS

纯洁的微笑  · 公众号  ·  · 2019-10-14 09:09

正文

上篇文章介绍了 如何使用 Spring Boot 上传文件 ,这篇文章我们介绍如何使用 Spring Boot 将文件上传到分布式文件系统 FastDFS 中。

这个项目会在上一个项目的基础上进行构建。

1、pom 包配置

    org.csource    fastdfs-client-java    1.27-SNAPSHOT

加入了 fastdfs-client-java 包,用来调用 FastDFS 相关的 API。

2、配置文件

resources 目录下添加 fdfs_client.conf 文件

connect_timeout = 60network_timeout = 60charset = UTF-8http.tracker_http_port = 8080http.anti_steal_token = nohttp.secret_key = 123456
tracker_server = 192.168.53.85:22122tracker_server = 192.168.53.86:22122

配置文件设置了连接的超时时间,编码格式以及 tracker_server 地址等信息

详细内容参考:fastdfs-client-java

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];






请到「今天看啥」查看全文


推荐文章
程序猿  ·  微信+DeepSeek来了!
2 天前
昆明信息港  ·  大跳水!暴跌77%!
2 天前
程序员小灰  ·  DeepSeek 被放弃了,阿里牛逼!!!
4 天前
正和岛  ·  曹德旺:为中美投资算笔经济账
8 年前
装修情报  ·  2016年家装消费者行为洞察
8 年前
战略前沿技术  ·  导弹发展需求与发展趋势分析
7 年前