FastDFS之java客户端使用

论坛 期权论坛 脚本     
匿名技术用户   2020-12-21 12:43   11   0

为了方便应用程序的访问FastDFS,官网提供了fastdfs-client-java,以便更好的与应用程序结合使用。

下载fastdfs-client-java源码添加到项目工程里面,添加配置文件:fdfs_client.conf

connect_timeout=3
network_timeout = 60
charset = ISO8859-1
http.tracker_http_port = 8080
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 192.168.18.43:22122
测试代码:

package cn.slimsmart.fastdfs;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;


/**
 *  基本操作
 */
public class FastDFSTest {

 /**
  * @param args
  * @throws Exception 
  */
 public static void main(String[] args) throws Exception {
  //加载配置文件的方式
  String configFileName = "src/main/resources/fdfs_client.conf";  
        try {  
            ClientGlobal.init(configFileName);  
        }catch(Exception e){
         e.printStackTrace();
        }
        
        /*
         * 也可以使用代码设置配置
         // 连接超时的时限
        ClientGlobal.setG_connect_timeout(2);
        // 网络超时的时限,单位为秒
        ClientGlobal.setG_network_timeout(30);
        ClientGlobal.setG_anti_steal_token(false);
        // 字符集
        ClientGlobal.setG_charset("UTF-8");
        ClientGlobal.setG_secret_key(null);
        // HTTP访问服务的端口号
        ClientGlobal.setG_tracker_http_port(8088);
        // Tracker服务器列表
        InetSocketAddress[] tracker_servers = new InetSocketAddress[1];
        tracker_servers[0] = new InetSocketAddress("192.168.18.43", 22122);
        ClientGlobal.setG_tracker_group(new TrackerGroup(tracker_servers));
         */
       File file = new File("src/main/resources/test.jpg");
       //返回储存路径:group1 M00/00/00/wKhuW1Vmj6KAZ09pAAC9przUxEk788.jpg
       String[] files =  uploadFile(file, "test.jpg", file.length());
       System.out.println(Arrays.asList(files));
      
      //下载文件
      downloadFile(files[0],files[1]);
      //查看文件信息
      getFileInfo(files[0],files[1]);
      getFileMate(files[0],files[1]);
      deleteFile(files[0],files[1]);
 }

 /**
  * 上传文件
  */
 public static String[] uploadFile(File file, String uploadFileName, long fileLength) throws IOException {
   System.out.println("上传文件=======================");
  byte[] fileBuff = getFileBuffer(new FileInputStream(file), fileLength);
  String[] files = null;
  String fileExtName = "";
  if (uploadFileName.contains(".")) {
   fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
  } else {
   System.out.println("Fail to upload file, because the format of filename is illegal.");
   return null;
  }

  // 建立连接
  TrackerClient tracker = new TrackerClient();
  TrackerServer trackerServer = tracker.getConnection();
  StorageServer storageServer = null;
  StorageClient client = new StorageClient(trackerServer, storageServer);

  // 设置元信息
  NameValuePair[] metaList = new NameValuePair[3];
  metaList[0] = new NameValuePair("fileName", uploadFileName);
  metaList[1] = new NameValuePair("fileExtName", fileExtName);
  metaList[2] = new NameValuePair("fileLength", String.valueOf(fileLength));

  // 上传文件
  try {
   files = client.upload_file(fileBuff, fileExtName, metaList);
  } catch (Exception e) {
   System.out.println("Upload file \"" + uploadFileName + "\"fails");
  }
  trackerServer.close();
  return files;
 }
 private static byte[] getFileBuffer(InputStream inStream, long fileLength) throws IOException {

  byte[] buffer = new byte[256 * 1024];
  byte[] fileBuffer = new byte[(int) fileLength];

  int count = 0;
  int length = 0;

  while ((length = inStream.read(buffer)) != -1) {
   for (int i = 0; i < length; ++i) {
    fileBuffer[count + i] = buffer[i];
   }
   count += length;
  }
  return fileBuffer;
 }
 
 //下载文件
 public static void downloadFile(String groupName,String filepath) throws Exception{
   System.out.println("下载文件=======================");
   TrackerClient tracker = new TrackerClient();
         TrackerServer trackerServer = tracker.getConnection();
         StorageServer storageServer = null;

         StorageClient storageClient = new StorageClient(trackerServer, storageServer);
         byte[] b = storageClient.download_file(groupName, filepath);
         System.out.println("文件大小:"+b.length);
         String fileName = "src/main/resources/test1.jpg";  
         FileOutputStream out = new FileOutputStream(fileName);
         out.write(b);
         out.flush();
         out.close();
 }
 
 //查看文件信息
 public static void getFileInfo(String groupName,String filepath) throws Exception{
  System.out.println("获取文件信息=======================");
     TrackerClient tracker = new TrackerClient();
        TrackerServer trackerServer = tracker.getConnection();
        StorageServer storageServer = null;

        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        FileInfo fi = storageClient.get_file_info(groupName,filepath);
        System.out.println("所在服务器地址:"+fi.getSourceIpAddr());
        System.out.println("文件大小:"+fi.getFileSize());
        System.out.println("文件创建时间:"+fi.getCreateTimestamp());
        System.out.println("文件CRC32 signature:"+fi.getCrc32());
 }
 
 public static void getFileMate(String groupName,String filepath) throws Exception{
  System.out.println("获取文件Mate=======================");
  TrackerClient tracker = new TrackerClient();
        TrackerServer trackerServer = tracker.getConnection();
        StorageServer storageServer = null;

        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        NameValuePair nvps[] = storageClient.get_metadata(groupName,filepath);
        for (NameValuePair nvp : nvps) {
                System.out.println(nvp.getName() + ":" + nvp.getValue());
        }
 }
 
 public static void deleteFile(String groupName,String filepath) throws Exception{
  System.out.println("删除文件=======================");
        TrackerClient tracker = new TrackerClient();
        TrackerServer trackerServer = tracker.getConnection();
        StorageServer storageServer = null;
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        int i = storageClient.delete_file(groupName, filepath);
        System.out.println(i == 0 ? "删除成功" : "删除失败:" + i);
 }
}
本实例中我们使用了StorageClient完成文件的基本操作,除此外还有一个实现类StorageClient1,这里就不演示了。

上面我们是通过字节的方式上传文件,也可以使用流的方式上传文件,请参考:以流的方式上传文件的客户端代码

另外,还有一客户端FastdfsClient,基于官方fastdfs-client-java客户端基础上,实现了连接池、健康检查等功能。大家可以尝试一下。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP