文章目录
SpringBoot整合FastDFS
1. FastDFS的安装
参考这个地址:https://blog.csdn.net/stormkai/article/details/88600370
2. pom.xml配置
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
3. fdfs_client.conf配置文件
在src/main/resources下添加fdfs_client.conf文件,内容如下:
connect_timeout = 30
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8888
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.0.104:22122
4. 测试
3.1 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class SpringbootFastdfsApplicationTests {
@Test
public void testUpload() throws Exception {
// 1、初始化全局配置。加载一个配置文件。
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
ClientGlobal.init(filePath);
log.info("filePath={}",filePath);
// 2、创建一个TrackerClient对象。
TrackerClient trackerClient = new TrackerClient();
// 3、创建一个TrackerServer对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 4、声明一个StorageServer对象,null。
StorageServer storageServer = null;
// 5、获得StorageClient对象。
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 6、直接调用StorageClient对象方法上传文件即可。
String[] strings = storageClient.upload_file("D:\\image\\a1.jpg", "jpg", null);
for (String string : strings) {
System.out.println(string);
}
}
@Test
public void testDeleteFile() throws Exception {
// 1、初始化全局配置。加载一个配置文件。
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
ClientGlobal.init(filePath);
log.info("filePath={}",filePath);
// 2、创建一个TrackerClient对象。
TrackerClient trackerClient = new TrackerClient();
// 3、创建一个TrackerServer对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 4、声明一个StorageServer对象,null。
StorageServer storageServer = null;
// 5、获得StorageClient对象。
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 6、直接调用StorageClient对象方法上传文件即可。
//返回值0代表删除成功
int result = storageClient.delete_file("group1", "M00/00/00/wKgAaFyM3fSANCgXAABMnNm0e54098.jpg");
System.out.println("result="+result);
}
}
3.2 测试结果
根据返回值通过浏览器访问:
4. 封装工具类
4.1 FastDFSFile
里面包含文件基础信息包括文件名、内容、文件类型、作者等。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FastDFSFile {
private String name;
private byte[] content;
private String ext;
private String md5;
private String author;
public FastDFSFile(String name, byte[] content, String ext) {
this.name = name;
this.content = content;
this.ext = ext;
}
}
4.2 FastDFSClient
@Slf4j
public class FastDFSClient {
static {
try {
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();;
ClientGlobal.init(filePath);
} catch (Exception e) {
log.error("FastDFS Client Init Fail!",e);
}
}
public static String[] upload(FastDFSFile file) {
log.info("File Name: " + file.getName() + "File Length:" + file.getContent().length);
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();
uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
} catch (IOException e) {
log.error("IO Exception when uploadind the file:" + file.getName(), e);
} catch (Exception e) {
log.error("Non IO Exception when uploadind the file:" + file.getName(), e);
}
log.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");
if (uploadResults == null && storageClient!=null) {
log.error("upload file fail, error code:" + storageClient.getErrorCode());
}
String groupName = uploadResults[0];
String remoteFileName = uploadResults[1];
log.info("upload file successfully!!!" + "group_name:" + groupName + ", remoteFileName:" + " " + remoteFileName);
return uploadResults;
}
public static FileInfo getFile(String groupName, String remoteFileName) {
try {
StorageClient storageClient = getTrackerClient();
return storageClient.get_file_info(groupName, remoteFileName);
} catch (IOException e) {
log.error("IO Exception: Get File from Fast DFS failed", e);
} catch (Exception e) {
log.error("Non IO Exception: Get File from Fast DFS failed", e);
}
return null;
}
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) {
log.error("IO Exception: Get File from Fast DFS failed", e);
} catch (Exception e) {
log.error("Non IO Exception: Get File from Fast DFS failed", e);
}
return null;
}
public static void deleteFile(String groupName, String remoteFileName)
throws Exception {
StorageClient storageClient = getTrackerClient();
int i = storageClient.delete_file(groupName, remoteFileName);
log.info("delete file successfully!!!" + i);
}
public static StorageServer[] getStoreStorages(String groupName)
throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
return trackerClient.getStoreStorages(trackerServer, groupName);
}
public static ServerInfo[] getFetchStorages(String groupName,
String remoteFileName) throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
}
public static String getTrackerUrl() throws IOException {
return "http://"+getTrackerServer().getInetSocketAddress().getHostString()+":"+ ClientGlobal.getG_tracker_http_port()+"/";
}
private static StorageClient getTrackerClient() throws IOException {
TrackerServer trackerServer = getTrackerServer();
StorageClient storageClient = new StorageClient(trackerServer, null);
return storageClient;
}
private static TrackerServer getTrackerServer() throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
return trackerServer;
}
}
4.3 封装类测试
@Test
public void testFastDFSClient() throws Exception {
//定义文件返回值
String[] fileAbsolutePath={};
//模拟上传文件过来的文件
MockMultipartFile mockMultipartFile = new MockMultipartFile("D:\\image\\a2.jpg", new FileInputStream(new File("D:\\image\\a2.jpg")));
String fileName=mockMultipartFile.getName();
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
byte[] file_buff = null;
InputStream inputStream=mockMultipartFile.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);
//上传文件
fileAbsolutePath = FastDFSClient.upload(file);
//文件返回浏览器可以访问的路径
String path=FastDFSClient.getTrackerUrl()+fileAbsolutePath[0]+ "/"+fileAbsolutePath[1];
System.out.println(path);
}
测试结果输出了访问的地址:
2019-03-16 21:07:47.990 INFO 12916 --- [ main] c.s.SpringbootFastdfsApplicationTests : Starting SpringbootFastdfsApplicationTests on PV-11 with PID 12916 (started by Admin in E:\git\workspace\stormkai-java\springboot-demo\springboot-fastdfs)
2019-03-16 21:07:47.991 INFO 12916 --- [ main] c.s.SpringbootFastdfsApplicationTests : No active profile set, falling back to default profiles: default
2019-03-16 21:07:48.873 INFO 12916 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-03-16 21:07:49.069 INFO 12916 --- [ main] c.s.SpringbootFastdfsApplicationTests : Started SpringbootFastdfsApplicationTests in 1.28 seconds (JVM running for 1.81)
2019-03-16 21:07:49.197 INFO 12916 --- [ main] com.stormkai.utils.FastDFSClient : File Name: D:\image\a2.jpgFile Length:37535
2019-03-16 21:07:49.246 INFO 12916 --- [ main] com.stormkai.utils.FastDFSClient : upload_file time used:48 ms
2019-03-16 21:07:49.246 INFO 12916 --- [ main] com.stormkai.utils.FastDFSClient : upload file successfully!!!group_name:group1, remoteFileName: M00/00/00/wKgAaFyM9SWANhJ5AACSn7DmVJ8323.jpg
http://192.168.0.104:8888/group1/M00/00/00/wKgAaFyM9SWANhJ5AACSn7DmVJ8323.jpg
2019-03-16 21:07:49.251 INFO 12916 --- [ Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationT
5. 源码存放位置
码云:https://gitee.com/KevinYang19/stormkai-java/tree/V1
6. 使用源码可能存在报错处理
6.1 pom.xml报错
org.csource fastdfs-client-java 1.27-SNAPSHOT这个报错的话,就去github上https://github.com/wangwei216/fastdfs-client-java-master下载下来安装到本地(mvn clean install)。
6.2 @slf4j、@Data、@NoArgsConstructor、@AllArgsConstructor报错
这个是我用了lombok插件,具体安装方法参考地址:https://blog.csdn.net/stormkai/article/details/86499461
然后就可以了。
6.2.1 lombok的使用
1). 在pom.xml中引入以下配置:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2). 所用的注解含义:
@slf4j 是相当于private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@Data 会为其类提供getter()/setter()及toString()方法
@ NoArgsConstructor 提供无参构造器
@AllArgsConstructor 提供全参构造器