FastDFS的配置、部署与API使用解读——设置FastDFS配置参数的两种方式

FastDFS的配置、部署与API使用解读——设置FastDFS配置参数的两种方式

 

一种方式是通过调用ClientGlobal类的初始化方法对配置文件进行加载,另一种是通过调用API逐一设置配置参数。后一种方式对于使用Zookeeper等加载属性的方式很方便。

 

1. 加载配置文件:

Java代码

String configFileName = "conf/dfs-client.conf";  

            try {  

                ClientGlobal.init(configFileName);  


2. 主动设置配置参数:

Java代码

//连接超时的时限,单位为毫秒  

ClientGlobal.setG_connect_timeout(2000);  

  

//网络超时的时限,单位为毫秒  

ClientGlobal.setG_network_timeout(30000);  

  

ClientGlobal.setG_anti_steal_token(false);  

  

//字符集  

ClientGlobal.setG_charset("UTF-8");  

  

ClientGlobal.setG_secret_key(null);  

  

//HTTP访问服务的端口号    

ClientGlobal.setG_tracker_http_port(7271);  

  

//Tracker服务器列表  

InetSocketAddress[] tracker_servers = new InetSocketAddress[szTrackerServers.length];  

tracker_servers[0] = "200.200.200.200:8080";  

tracker_servers[1] = "200.200.201.200:8080";  

tracker_servers[2] = "200.200.202.200:8080";  

ClientGlobal.setG_tracker_group(new TrackerGroup(trackerServers));  

调用的API为:

String[] upload_file(

String group_name,//组名,不指定则可设为null

long file_size,//文件大小,必须制定

UploadCallback callback,//回调

String file_ext_name,

NameValuePair[] meta_list

)

 

Java代码

/** 

 * Upload File to DFS, directly transferring java.io.InputStream to java.io.OutStream 

 * @author Poechant 

 * @email zhongchao.ustc@gmail.com 

 * @param fileBuff, file to be uploaded. 

 * @param uploadFileName, the name of the file. 

 * @param fileLength, the length of the file. 

 * @return the file ID in DFS. 

 * @throws IOException  

 */  

public String[] uploadFileByStream(InputStream inStream, String uploadFileName, long fileLength) throws IOException {  

      

    String[] results = null;  

    String fileExtName = "";  

    if (uploadFileName.contains(".")) {  

        fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);  

    } else {  

        logger.warn("Fail to upload file, because the format of filename is illegal.");  

        return results;  

    }  

      

    TrackerClient tracker = new TrackerClient();  

       TrackerServer trackerServer = tracker.getConnection();  

       StorageServer storageServer = null;  

       StorageClient1 client = new StorageClient1(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 {  

        // results[0]: groupName, results[1]: remoteFilename.  

        results = client.upload_file(null, fileLength, new UploadFileSender(inStream), fileExtName, metaList);  

    } catch (Exception e) {  

        logger.warn("Upload file \"" + uploadFileName + "\"fails");  

    }  

         

        trackerServer.close();  

      

    return results;       

}  

 

其中的UploadFileSender是一个实现了UploadCallback接口的类:

Java代码

private static class UploadFileSender implements UploadCallback {  

      

    private InputStream inStream;  

      

    public UploadFileSender(InputStream inStream) {  

        this.inStream = inStream;  

    }  

      

    public int send(OutputStream out) throws IOException {  

        int readBytes;  

        while((readBytes = inStream.read()) > 0) {  

            out.write(readBytes);  

        }  

        return 0;  

    }  

}   

通过Servlet得到InputStream、文件名称和文件长度,然后通过调用FastDFS提供的Java API把文件上传到FastDFS服务器。

下段代码中的getFileBuffer可本博客参考上一篇博文。(by Poechant)

Java代码

/** 

 * Upload File to DFS. 

 * @param fileBuff, file to be uploaded. 

 * @param uploadFileName, the name of the file. 

 * @param fileLength, the length of the file. 

 * @return the file ID in DFS. 

 * @throws IOException  

 */  

public String uploadFile(InputStream inStream, String uploadFileName, long fileLength) throws IOException {  

      

    byte[] fileBuff = getFileBuffer(inStream, fileLength);  

    String fileId = "";  

    String fileExtName = "";  

    if (uploadFileName.contains(".")) {  

        fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);  

    } else {  

        logger.warn("Fail to upload file, because the format of filename is illegal.");  

        return fileId;  

    }  

      

    TrackerClient tracker = new TrackerClient();  

       TrackerServer trackerServer = tracker.getConnection();  

       StorageServer storageServer = null;  

       StorageClient1 client = new StorageClient1(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 {  

        fileId = client.upload_file1(fileBuff, fileExtName, metaList);  

    } catch (Exception e) {  

        logger.warn("Upload file \"" + uploadFileName + "\"fails");  

    }  

         

        trackerServer.close();  

      

    return fileId;        

}  

Java代码

/** 

     * Transfer java.io.InpuStream to byte array. 

     * @param inStream, input stream of the uploaded file. 

     * @param fileLength, the length of the file. 

     * @return the byte array transferred from java.io.Inputstream. 

     * @throws IOException occurred by the method read(byte[]) of java.io.InputStream. 

     */  

        private 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;  

    }  

 

文本格式不能很好显示,请见谅(附件里有比较齐整的excel表格统计) 大小类型 传输类型 api方法 文件大小 花费时间 速率byte/ms 速率mb/s 缓存数组 次数 备注 大文件 下载 download_file(group_name, remote_filename, localFile) 1073741824(约1G) 28343ms 37883 36.12804413 无 1 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 29195ms 36778 35.07423401 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 24352ms 44092 42.04940796 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 24831ms 43241 41.23783112 2K 1 实现DownloadCallback,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 25922ms 41422 39.50309753 8K 1 实现DownloadCallback,BufferedOutputStream 普通文件 下载 download_file(group_name, remote_filename, localFile) 59113472(约56M) 382ms 154747 147.5782394 无 1 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约57M) 369ms 160199 152.7776718 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约58M) 499ms 118702 113.2030487 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 59113472(约59M) 592ms 99853 95.22724152 2K 1 实现DownloadCallback,BufferedOutputStream 下载建议:100M内数据使用fastDFS提供的DownloadStream;大于1G的数据,使用BufferedOutputStream和DowloadStream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值