FastDFS的详细安装步骤一
FastDFS的详细安装步骤二
前两篇我们分别把FastDFS基本模块和FastDFS+nginx都搭建完成,既然图片服务器搭建好啦,那么我们就该开始结合到项目里用java代码来实际操作上传图片啦。这篇文章主要讲解springboot整合FastDFS_Client来完成上传文件的功能。
现在网上基本上就三种方法把FastDFS_Client集成到项目里:
第一种是下载fastdfs-client-java-master源码包打包引入到项目里
第二种是直接在pom文件里加上网上分享的依赖的maven坐标
一、这里讲解的就是直接依赖网上的maven坐标,添加依赖
com.github.tobato
fastdfs-client
1.26.3
commons-io
commons-io
2.6
二、添加配置文件application.properties
server.port=8989
# fastDFS 配置
fdfs.so-timeout=1501
fdfs.connect-timeout=601
fdfs.thumb-image.width=150
fdfs.thumb-image.height=150
fdfs.web-server-url=192.168.xxx.x:xxxxx/ //这个会追加在返回地址的前面 ip+nginx的端口
fdfs.tracker-list[0]=192.168.xxx.x:22122
三、FastDFS工具类
import com.github.tobato.fastdfs.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
@Slf4j
@Component
public class FastDFSUtils {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private FdfsWebServer fdfsWebServer;
/**
* 上传文件
*
* @param file 文件对象
* @return 文件访问地址
* @throws IOException
*/
public String uploadFile(MultipartFile file) throws IOException {
StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
return getResAccessUrl(storePath);
}
/**
* 上传文件
*
* @param file 文件对象
* @return 文件访问地址
* @throws IOException
*/
public String uploadFile(File file) throws IOException {
FileInputStream inputStream = new FileInputStream(file);
StorePath storePath = storageClient.uploadFile(inputStream, file.length(), FilenameUtils.getExtension(file.getName()), null);
return getResAccessUrl(storePath);
}
/**
* 将一段字符串生成一个文件上传
*
* @param content 文件内容
* @param fileExtension
* @return
*/
public String uploadFile(String content, String fileExtension) {
byte[] buff = content.getBytes(Charset.forName("UTF-8"));
ByteArrayInputStream stream = new ByteArrayInputStream(buff);
StorePath storePath = storageClient.uploadFile(stream, buff.length, fileExtension, null);
return getResAccessUrl(storePath);
}
// 封装图片完整URL地址
private String getResAccessUrl(StorePath storePath) {
String fileUrl = fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
return fileUrl;
}
/**
* 下载文件
*
* @param fileUrl 文件url
* @return
*/
public byte[] download(String fileUrl) {
String group = fileUrl.substring(0, fileUrl.indexOf("/"));
String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
byte[] bytes = storageClient.downloadFile(group, path, new DownloadByteArray());
return bytes;
}
/**
* 删除文件
*
* @param fileUrl 文件访问地址
* @return
*/
public void deleteFile(String fileUrl) {
if (StringUtils.isEmpty(fileUrl)) {
return;
}
try {
StorePath storePath = StorePath.praseFromUrl(fileUrl);
storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
} catch (FdfsUnsupportStorePathException e) {
log.warn(e.getMessage());
}
}
}
加载 FastDFS 配置类
import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ComponetImport {
}
controller 类
@RestController
@RequestMapping("/opinion")
public class FastDFSController {
@Autowired
private FastDFSClient fdfsClient;
/**
* 文件上传
* @param file
* @return
* @throws Exception
*/
@RequestMapping("/upload1")
public Map upload(@RequestParam("pic")MultipartFile file) throws Exception{
String url = fdfsClient.uploadFile(file);
Map result = new HashMap<>();
result.put("code", 200);
result.put("msg", "上传成功");
result.put("url", url);
return result;
}
}
四、用postman测试一下
这里返回值的形式和controller里的样式不一样,是因为我的实际代码,返回值不是map,是专门封装了一个响应前端数据的类。但是这里你直接复制这个代码操作不会有任何影响。
参考文章:https://blog.csdn.net/lgw96000/article/details/83268724
到这里,springboot简单整合FastDFS已经基本完成,但是还有一些问题,比如你本地没法连接远程服务器tracker 192.168.xxx.x:22122时,就算你映射192.168.xxx.x:22122外网地址,但是由于fastdfs_client_java客户端是先访问tracker,tracker返回可用的storage的ip,但是这个ip和端口是内网的storage的,这样对调试会产生很大的不便。暂时对于这种特殊的情况,并没有很好的解决办法,只能把应用扔到内网服务器去调试。
我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有76位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言。