1.因为fastdfs-client-java依赖包在maven中央仓库无法取得,所以需要到https://github.com/happyfish100/fastdfs-client-java进行下载,
2.下载后解压fastdfs-client-java-master.zip
3.运行CMD,切换至解压出来的fastdfs-client-java-master文件夹
mvn clean install
4.出现下图表示导入成功
5.在项目的pom.xml文件中增加
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.29-SNAPSHOT</version>
</dependency>
6.在项目resources文件夹下创建fdfs_client.conf文件
#默认值为30s
connect_timeout = 10
#默认值为30s
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
# token 防盗链功能
http.anti_steal_token = true
http.secret_key = ZFnWLBqrX3
#fastdfs.tracker_servers=192.168.14.132:22122,192.168.14.133:22122
tracker_server = 192.168.14.200:22122
#若采用keepalived,则指向虚拟ip。否则采用下面两行的形式
#tracker_server = 192.168.14.133:22122
#tracker_server = 192.168.14.132:22122
## Tracker Server, if more than one, separate with ","
#fastdfs.tracker_servers=${tracker_server_addr}:22122
7.编辑文件服务器上的/etc/fdfs/http.conf
#设置为true表示开启token验证
http.anti_steal.check_token=false
#设置token失效的时间单位为秒(s)
http.anti_steal.token_ttl=1800
#密钥,跟客户端配置文件的fastdfs.http_secret_key保持一致
http.anti_steal.secret_key=FASTDFS1234567890
#如果token检查失败,返回的页面,该文件必须存在,否则报错
http.anti_steal.token_check_fail=/usr/local/fail.jpg
8.封装FastDFS上传工具类
package FastDFSUtils;
import baseUtils.MyException;
import baseUtils.ResultEnum;
import baseUtils.ResultVO;
import baseUtils.ResultVOUtil;
import org.csource.common.IniFileReader;
import org.csource.fastdfs.*;
import org.csource.common.NameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FastDFSClient {
private final static Logger logger = LoggerFactory.getLogger(FastDFSClient.class);
//文件系统初始化
static {
try {
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
IniFileReader iniReader = new IniFileReader(filePath);
String[] szTrackerServers = iniReader.getValues("tracker_server");
ClientGlobal.init(filePath);
} catch (Exception e) {
throw new MyException(ResultEnum.FAST_DFS_ERROR);
}
}
/**
* 文件上传
* @param file 自定义文件上传类
* @return
*/
public static String upload(FastDFSFile file){
NameValuePair[] meta_list = new NameValuePair[1];
meta_list[0] = new NameValuePair("author", file.getAuthor());
long startTime = System.currentTimeMillis();
String[] uploadResults = null;
StorageClient storageClient=null;
try {
storageClient = getTrackerClient();
//upload_file()三个参数:@param fileContent ①:文件的内容,字节数组 ②:文件扩展名 ③文件扩展信息 数组
uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
}catch (Exception e){
e.printStackTrace();
throw new MyException(ResultEnum.FAST_DFS_ERROR);
}
if (uploadResults == null && storageClient!=null) {
logger.error("upload file fail, error code:" + storageClient.getErrorCode());
}
logger.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");
String groupName = uploadResults[0];
String remoteFileName = uploadResults[1];
return groupName+"/"+remoteFileName;
}
/**
* 查询文件信息
* @param groupName
* @param remoteFileName
* @return
*/
public static FileInfo getFile(String groupName, String remoteFileName) {
try {
StorageClient storageClient = getTrackerClient();
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;
}
/**
* 下载文件
* @param groupName 文件路径
* @param remoteFileName 输出流 中包含要输出到磁盘的路径
* @return
*/
public static InputStream downFile(String groupName, String remoteFileName) {
try {
StorageClient storageClient = getTrackerClient();
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;
}
/**
* 删除文件
* ==0表示成功
* @param groupName 组名 如:group1
* @param remoteFileName 不带组名的路径名称 如:M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg
* @throws Exception
*/
public static int deleteFile(String groupName, String remoteFileName)
throws Exception {
StorageClient storageClient = getTrackerClient();
return storageClient.delete_file(groupName, remoteFileName);
}
/**
* 获取storage
* @param groupName 组名
* @return
* @throws IOException
*/
public static StorageServer[] getStoreStorages(String groupName){
try {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
return trackerClient.getStoreStorages(trackerServer, groupName);
}catch (Exception e){
throw new MyException(ResultEnum.FAST_DFS_ERROR);
}
}
/**
*
* @param groupName
* @param remoteFileName
* @return
* @throws IOException
*/
public static ServerInfo[] getFetchStorages(String groupName,String remoteFileName){
try {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
}catch (Exception e){
throw new MyException(ResultEnum.FAST_DFS_ERROR);
}
}
/**
* 获取reacker地址
* @return
* @throws IOException
*/
public static String getTrackerUrl() throws IOException {
return "http://"+getTrackerServer().getInetSocketAddress().getHostString()+":"+ ClientGlobal.getG_tracker_http_port()+"/";
}
/**
* 获取tracker连接
* @return
* @throws IOException
*/
private static StorageClient getTrackerClient() throws IOException {
TrackerServer trackerServer = getTrackerServer();
StorageClient storageClient = new StorageClient(trackerServer, null);
return storageClient;
}
/**
* 获取tracker服务
* @return
* @throws IOException
*/
private static TrackerServer getTrackerServer() throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
return trackerServer;
}
}
9.FastDFSFile.java
package FastDFSUtils;
public class FastDFSFile {
private String name;//文件名
private byte[] content; //文件的内容,字节数组
private String ext; //文件扩展名,不包含(.)
private String md5; //加密
private String author;
public FastDFSFile() {
}
public FastDFSFile(String name, byte[] content, String ext) {
this.name = name;
this.content = content;
this.ext = ext;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public String getExt() {
return ext;
}
public void setExt(String ext) {
this.ext = ext;
}
public String getMd5() {
return md5;
}
public void setMd5(String md5) {
this.md5 = md5;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
10.UploadDFS.java
package FastDFSUtils;
import baseUtils.MyException;
import baseUtils.ResultEnum;
import baseUtils.ResultVO;
import baseUtils.ResultVOUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
@RestController
@SpringBootApplication
public class UploadDFS {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@PostMapping("/UploadDFS.action")
public Object FileUpload(HttpServletRequest request) throws Exception{
logger.info("UploadDFS");
List<Map<String,String>> result=new ArrayList<Map<String,String>>();
//允许上传的文件类型
String fileType = "jpg,jpeg,bmp,png,xls,xlsx,doc,docx,ppt,pptx,text,txt,pdf,mp4,zip,7z";
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
if(files.size()==0){
throw new MyException(ResultEnum.FILE_DATA_EMPTY);
}
int IsSuccess=1;
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
String fileName = file.getOriginalFilename();
//获取文件后缀名
String extName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase().trim();
//判断是否为允许上传的文件类型
if ( !Arrays.<String> asList(fileType.split(",")).contains(extName))
{
IsSuccess=0;
}
}
if(IsSuccess==0){
throw new MyException(1036,"仅支持jpg,jpeg,bmp,png,xls,xlsx,doc,docx,ppt,pptx,text,txt,pdf,mp4,zip,7z格式的文件");
}
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
String fileName = file.getOriginalFilename();
//获取文件后缀名
String extName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase().trim();
String oldName=fileName.substring(0,fileName.lastIndexOf("."));
try {
String path = saveFile(file);
Map<String,String> data=new HashMap<String,String>();
data.put("Url",path);
String newFileName=path.substring(path.lastIndexOf("/")+1);
data.put("FileName",newFileName);
data.put("oldName",oldName);
data.put("extName",extName);
result.add(data);
} catch (MyException e){
throw e;
}catch (Exception e) {
throw new MyException(1037,"文件\""+fileName+"\"上传失败");
}
}
return ResultVOUtil.success(result);
}
/**
* @param multipartFile
* @return
* @throws IOException
*/
public String saveFile(MultipartFile multipartFile) throws IOException {
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);
return FastDFSClient.upload(file);
}
}
本文参考了以下链接,感谢原文作者:
https://www.cnblogs.com/zeussbook/p/10764086.html