springboot项目结合fastdfs做文件上传

Posted luffy5459

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot项目结合fastdfs做文件上传相关的知识,希望对你有一定的参考价值。

    前面一篇博客介绍通过docker构建fastdfs,并且在storage容器中通过fdfs_upload_file命令成功上传了一个文件,最后通过http://ip:8888/group/path访问到了文件,以为这样做就算fastdfs环境搭建成功了。

    不料,通过springboot+fastdfs-client来上传文件却报错了:

    can't create connection to/172.17.0.1:23000

    这个错误的原因是,trackerclient通过我们配置的tracker-list 192.168.197.128:22122 服务来获取storageserver的时候,拿到的是172.17.0.1:23000配置,而这个地址在tracker容器中,是无法访问storage容器中的存储服务的。 

    出错的原因找到了,解决办法其实也能想的到,就是配置storage地址为虚拟机ip地址,而不是docker容器ip地址。 看了很多文章,这里最好用的办法就是在docker容器运行的时候,指定--network=host,表示docker容器与虚拟机共用一个主机地址,这样,也不需要暴露端口了。

    docker容器启动的命令变为这样:

  1. docker run -d --name tracker --network=host delron/fastdfs:latest tracker
  2. docker run -d --name storage --network=host -e TRACKER_SERVER=192.168.197.128:22122 delron/fastdfs:latest storage

    这样搭建的fastdfs就可以给外部上传使用了。

    springboot+fastdfs-client项目配置:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
            <version>2.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.27.2</version>
        </dependency>

    fastdfs相关配置application.properties:

fdfs.web-server-url=http://192.168.197.128:8888
fdfs.tracker-list[0]=192.168.197.128:22122
fdfs.connect-timeout=60000
fdfs.so-timeout=36000
fdfs.pool.max-total=200
fdfs.pool.max-total-per-key=50
fdfs.pool.max-wait-millis=60000

    上传工具类:

package com.example.undertowtest.utils;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;

@Component
public class FastDFSClientUtil 
    @Value("$fdfs.web-server-url")
    private String webServerUrl;

    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    public String uploadFile(MultipartFile file) throws IOException
        StorePath path =fastFileStorageClient.uploadFile((InputStream) file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null);
        return webServerUrl + "/" + path.getFullPath();
    


    控制层代码:

package com.example.undertowtest.web;
import com.example.undertowtest.utils.FastDFSClientUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("/test")
public class TestController extends  BaseController


    @Autowired
    private FastDFSClientUtil fastDFSClientUtil;

    @PostMapping("/upload-by-fastdfs")
    public Map<String,Object> uploadByFastDfs(MultipartFile file)
        Map<String,Object> result = new HashMap<>();
        try
            String groupPath = fastDFSClientUtil.uploadFile(file);
            result.put("path",groupPath);
            result.put("code",200);
            result.put("msg","上传成功");
        catch (Exception e)
            result.put("code",500);
            result.put("msg","上传失败");
            e.printStackTrace();
        
        return result;
    

    因为是springboot web项目,所以我还在static目录下整了一个index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>upload</title>
</head>
<body>
     <h2>upload fastdfs test.</h2>
     <form action="/test/upload-by-fastdfs" enctype="multipart/form-data" method="post">
         <div>
            <label>选择文件</label> <input type="file" name="file"/>
         </div>
         <div>
             <input type="submit" value="上传"/>
         </div>
     </form>
</body>
</html>

    启动项目,访问首页,就可以测试上传了。

     springboot结合fastdfs-client做文件上传的示例就介绍完了,代码相对来说比较简洁,上传借助api,两行代码就搞定。主要还是在于docker搭建fastdfs需要注意的地方,采用--network=host的方式最简单。 

以上是关于springboot项目结合fastdfs做文件上传的主要内容,如果未能解决你的问题,请参考以下文章

高可用FastDFS多Group多Storage多Tracker主备结合SpringBoot

FastDFS结合FastDHT实现文件去重存储

fastDFS安装使用

fastDFS安装使用

(二十四)ATP应用测试平台——springboot集成fastdfs上传与下载功能

搭建fastdfs服务,及单机redis服务,springboot实现h5与fastdfs之间的断点续传,大文件上传,秒传文件和批量上传