FastDFS学习(三)—— SpringBoot集成FastDFS

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q410654146/article/details/98625344

相关依赖

<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
<dependency>
   <groupId>net.oschina.zcx7878</groupId>
   <artifactId>fastdfs-client-java</artifactId>
   <version>1.27.0.0</version>
</dependency>

FastDFS上传客户端工具类

/**
 * FastDFS文件系统客户端
 * @author: Kellan_Song
 * @date: 2019-08-04 21:12
 **/
@Component
public class FastDFSClient {
    
     private final String GROUP_NAME = "group1"; //群组名
    private TrackerClient trackerClient; 
    private TrackerServer trackerServer;
    private StorageServer storageServer;
    private StorageClient storageClient;

    public FastDFSClient() throws Exception {
        ClientGlobal.initByTrackers("193.112.40.54:22122");
        trackerClient = new TrackerClient(ClientGlobal.g_tracker_group);
        trackerServer = trackerClient.getConnection();
        storageServer = trackerClient.getStoreStorage(trackerServer);
        storageClient = new StorageClient(trackerServer, storageServer);
    }

    /**
     * 上传文件
     * @param file 文件对象
     * @param fileName 文件名
     * @return
     */
    public  String[] uploadFile(File file, String fileName) {
        try {
            byte[] buff = IOUtils.toByteArray(new FileInputStream(file));
            return uploadFile(buff, fileName, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 上传文件
     * @param buff 文件流
     * @param fileName 文件名
     * @return
     */
    public  String[] uploadFile(byte[] buff, String fileName) {
        return uploadFile(buff, fileName, null);
    }

    /**
     * 上传文件
     * @param file 文件
     * @return
     */
    public  String[] uploadFile(MultipartFile file) {
        try {
            return uploadFile(file.getBytes(), file.getOriginalFilename(), null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 上传文件
     *
     * @param buff     文件流
     * @param fileName 文件名
     * @param metaList 文件元数据
     * @return
     */
    public  String[] uploadFile(byte[] buff, String fileName, Map<String,String> metaList) {
        String prefix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); // 文件后缀名
        try {
            NameValuePair[] nameValuePairs = null;
            if (metaList != null) {
                nameValuePairs = new NameValuePair[metaList.size()];
                int index = 0;
                for (Iterator<Map.Entry<String,String>> iterator = metaList.entrySet().iterator(); iterator.hasNext();) {
                    Map.Entry<String,String> entry = iterator.next();
                    String name = entry.getKey();
                    String value = entry.getValue();
                    nameValuePairs[index++] = new NameValuePair(name,value);
                }
            }
            return storageClient.upload_file(GROUP_NAME, buff, prefix, nameValuePairs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 下载文件
     * @param fileId 文件ID(上传文件成功后返回的ID)
     * @return
     */
    public byte[] downloadFile(String fileId) {
        try {
            byte[] content = storageClient.download_file(GROUP_NAME,fileId);
            return content;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 删除文件
     * @param fileId 文件ID
     * @return 删除失败返回-1,否则返回0
     */
    public int deleteFile(String groupname,String fileId) {
        try {
            return storageClient.delete_file(groupname,fileId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

    /**
     * 获取文件元数据
     * @param fileId 文件ID
     * @return
     */
    public Map<String,String> getFileMetadata(String groupname,String fileId) {
        try {
            NameValuePair[] metaList = storageClient.get_metadata(groupname,fileId);
            if (metaList != null) {
                HashMap<String,String> map = new HashMap<String, String>();
                for (NameValuePair metaItem : metaList) {
                    map.put(metaItem.getName(),metaItem.getValue());
                }
                return map;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

说明

核心点在初始化配置文件的方式:ClientGlobal类常用几个初始化方式:

  • init(String conf_filename)
  • initByProperties(String propsFilePath)
  • initByProperties(Properties props)
  • initByTrackers(String trackerServers)

核心配置参数:

#连接tracker服务器超时时长
connect_timeout = 2  
#socket连接超时时长
network_timeout = 30
#文件内容编码 
charset = UTF-8 
#tracker服务器端口
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890

#tracker服务器IP和端口(可以写多个)
tracker_server = 192.168.1.190:22122 

PS:以上示例由于只是演示,其他配置参数ClientGlobal类都有默认,所以示例中使用的初始化参数方法直接传入tracker_server的ip和端口即可;


错误记录:

1 java.net.SocketTimeoutException: connect timed out

连接失败,目前探索到,有以下两种情况会引起连接失败:
(1) 端口未开启
由于使用fastdfs-client-java时,配置只需要配置Tracker服务地址和端口;这很容易造成一种误会就是外网端口只需要开启Tracker服务端口(默认22122)。但实际上,Tracker服务只算是一个中间服务,它会拿到可用的Storage服务地址和端口,最后文件上传是由我们开发的服务直接上传到Storage服务的。所以,服务器的外网端口,一定要记得开启Storage的端口(默认23000).

(2) Tracker地址不匹配
很多人认为,在配置storage.conf时,由于storage服务和tracker服务都在内网,可以使用内网ip连接。而Java服务配置的Tracker地址时,是属于内网网关系时,就需要配置成外网ip。但实际上,Java服务配置的tracker地址,与storage.conf配置的地址,都是需要可访问,并一致的。 一个配置内网ip,另一个配置外网ip,这样就会引起connect timed out错误。

展开阅读全文

没有更多推荐了,返回首页