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项目配置:

        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
            
        
        
            org.springframework.boot
            spring-boot-starter-undertow
            2.2.5.RELEASE
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            com.github.tobato
            fastdfs-client
            1.27.2
        

    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 uploadByFastDfs(MultipartFile file){
        Map 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




    
    upload


     

upload fastdfs test.

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

springboot项目结合fastdfs做文件上传_第1张图片

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

你可能感兴趣的:(java,fastdfs,tracker,storage,storepath,springboot)