FastDFTJava客户端使用
阅读原文时间:2023年07月12日阅读:1

余庆先生提供了一个Java客户端,但是作为一个C程序员,写的java代码可想而知。而且已经很久不维护了。

这里推荐一个开源的FastDFS客户端,支持最新的SpringBoot2.0。

配置使用极为简单,支持连接池,支持自动生成缩略图,狂拽酷炫吊炸天啊,有木有。

地址:tobato/FastDFS_client

接下来,我们就用FastDFS改造~~~-upload工程。

1.1.1.引入依赖

在父工程中,我们已经管理了依赖,版本为:

1.26.2

因此,这里我们直接在taotao-upload工程的pom.xml中引入坐标即可:

com.github.tobato fastdfs-client

1.1.2.引入配置类

纯java配置:

@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {

}

1.1.3.编写FastDFS属性

在application.yml配置文件中追加如下内容:

fdfs:
so-timeout: 1501 # 超时时间
connect-timeout: 601 # 连接超时时间
thumb-image: # 缩略图
width: 60
height: 60
tracker-list: # tracker地址:你的虚拟机服务器地址+端口(默认是22122)
- 192.168.0.211:22122

1.1.4.配置hosts

将来通过域名:image.~~~.com这个域名访问fastDFS服务器上的图片资源。所以,需要代理到虚拟机地址:

配置hosts文件,使image.~~~.com可以访问fastDFS服务器

1.1.5.测试

创建测试类:

把以下内容copy进去:

@SpringBootTest
@RunWith(SpringRunner.class)
public class FastDFSTest {

@Autowired
private FastFileStorageClient storageClient;

@Autowired
private ThumbImageConfig thumbImageConfig;

@Test
public void testUpload() throws FileNotFoundException {
// 要上传的文件
File file = new File("C:\\Users\\joedy\\Pictures\\xbx1.jpg");
// 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
StorePath storePath = this.storageClient.uploadFile(
new FileInputStream(file), file.length(), "jpg", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
}

@Test
public void testUploadAndCreateThumb() throws FileNotFoundException {
File file = new File("C:\\Users\\joedy\\Pictures\\xbx1.jpg");
// 上传并且生成缩略图
StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
new FileInputStream(file), file.length(), "png", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
// 获取缩略图路径
String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
System.out.println(path);
}
}

结果:

group1/M00/00/00/wKg4ZVsWl5eAdLNZAABAhya2V0c424.jpg
M00/00/00/wKg4ZVsWl5eAdLNZAABAhya2V0c424.jpg
group1/M00/00/00/wKg4ZVsWmD-ARnWiAABAhya2V0c772.png
M00/00/00/wKg4ZVsWmD-ARnWiAABAhya2V0c772.png
M00/00/00/wKg4ZVsWmD-ARnWiAABAhya2V0c772_60x60.png

访问第二组第一个路径:

访问最后一个路径(缩略图路径),注意加组名(group1)

红色标记为新加入的

@Service
public class UploadService {

@Autowired  
private FastFileStorageClient storageClient;

private static final List<String> CONTENT\_TYPES = Arrays.asList("image/jpeg", "image/gif");

private static final Logger LOGGER = LoggerFactory.getLogger(UploadService.class);

public String upload(MultipartFile file) {

    String originalFilename = file.getOriginalFilename();  
    // 校验文件的类型  
    String contentType = file.getContentType();  
    if (!CONTENT\_TYPES.contains(contentType)){  
        // 文件类型不合法,直接返回null  
        LOGGER.info("文件类型不合法:{}", originalFilename);  
        return null;  
    }

    try {  
        // 校验文件的内容  
        BufferedImage bufferedImage = ImageIO.read(file.getInputStream());  
        if (bufferedImage == null){  
            LOGGER.info("文件内容不合法:{}", originalFilename);  
            return null;  
        }

        // 保存到服务器  
        // file.transferTo(new File("C:\\\\~~~\\\\images\\\\" + originalFilename));  
        String ext = StringUtils.substringAfterLast(originalFilename, ".");  
        StorePath storePath = this.storageClient.uploadFile(file.getInputStream(), file.getSize(), ext, null);

        // 生成url地址,返回  
        return "http://image.~~~.com/" + storePath.getFullPath();  
    } catch (IOException e) {  
        LOGGER.info("服务器内部错误:{}", originalFilename);  
        e.printStackTrace();  
    }  
    return null;  
}  

}