SpringBoot整合FastDFS

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 提供全参构造器

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值