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容器启动的命令变为这样:
- docker run -d --name tracker --network=host delron/fastdfs:latest tracker
- 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
(二十四)ATP应用测试平台——springboot集成fastdfs上传与下载功能
搭建fastdfs服务,及单机redis服务,springboot实现h5与fastdfs之间的断点续传,大文件上传,秒传文件和批量上传