FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码

1、下载FastDFS的API FastDFS提供Java和PHP等语言的客户端API。可以到FastDFS在Google Code的项目主页 http://code.google.com/p/fastdfs/downloads/list 下载。本文以Java API为例。
2、调用API的上传接口 通过Servlet得到InputStream、文件名称和文件长度,然后通过调用FastDFS提供的Java API把文件上传到FastDFS服务器。下段代码中的getFileBuffer可参考本博客上一篇博文。(by Poechant)

[java] view plaincopyprint?

  1. /**
  2. * Upload File to DFS.
  3. * @param fileBuff, file to be uploaded.
  4. * @param uploadFileName, the name of the file.
  5. * @param fileLength, the length of the file.
  6. * @return the file ID in DFS.
  7. * @throws IOException
  8. */
  9. public String uploadFile(InputStream inStream, String uploadFileName, long fileLength) throws IOException {
  10. byte[] fileBuff = getFileBuffer(inStream, fileLength);
  11. String fileId = "";
  12. String fileExtName = "";
  13. if (uploadFileName.contains(".")) {
  14. fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
  15. } else {
  16. logger.warn("Fail to upload file, because the format of filename is illegal.");
  17. return fileId;
  18. }
  19. //建立连接
  20. TrackerClient tracker = new TrackerClient();
  21. TrackerServer trackerServer = tracker.getConnection();
  22. StorageServer storageServer = null;
  23. StorageClient1 client = new StorageClient1(trackerServer, storageServer);
  24. //设置元信息
  25. NameValuePair[] metaList = new NameValuePair[3];
  26. metaList[0] = new NameValuePair("fileName", uploadFileName);
  27. metaList[1] = new NameValuePair("fileExtName", fileExtName);
  28. metaList[2] = new NameValuePair("fileLength", String.valueOf(fileLength));
  29. //上传文件
  30. try {
  31. fileId = client.upload_file1(fileBuff, fileExtName, metaList);
  32. } catch (Exception e) {
  33. logger.warn("Upload file \"" + uploadFileName + "\"fails");
  34. }
  35. trackerServer.close();
  36. return fileId;
  37. }
/**
 * 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;
}

3、调用方式详解 (1)客户端与Tracker Server通信 根据《FastDFS的配置、部署与API使用解读(1)Get Started with FastDFS》一文中提供的FastDFS的工作原理,结合上面的代码,首先通过TrackerClient构造函数从全局配置中获取Tracker Servers的IP和端口初始化一个TrackerClient对象tracker,并与其建立连接,我们可以从API的源码中看到:

[java] view plaincopyprint?

  1. /**
  2. * constructor with global tracker group
  3. */
  4. public TrackerClient()
  5. {
  6. this.tracker_group = ClientGlobal.g_tracker_group;
  7. }
  8. /**
  9. * constructor with specified tracker group
  10. * @param tracker_group the tracker group object
  11. */
  12. public TrackerClient(TrackerGroup tracker_group)
  13. {
  14. this.tracker_group = tracker_group;
  15. }
/**
* constructor with global tracker group
*/
public TrackerClient()
{
	this.tracker_group = ClientGlobal.g_tracker_group;
}
/**
* constructor with specified tracker group
* @param tracker_group the tracker group object
*/
public TrackerClient(TrackerGroup tracker_group)
{
	this.tracker_group = tracker_group;
}

?上述代码中ClientGlobal是一个提供很多静态成员供外部读取的类。通过tracker这个TrackerClient建立的与Tracker Server的连接,实例化了一个trackerServer对象。

(2)客户端与Storage Server通信

通过trackerServer取得某一个可用的Storage Server的地址并用其实例化一个StorageClient1对象。这样就完成了FastDFS的客户端调用上传、下载、删除等所有操作的前期建立连接的工作。
(3)调用文件操作API 这些操作包括upload、download、append、delete等。上例中提供的是上传的实例。

时间: 2024-08-08 13:58:21

FastDFS的配置、部署与API使用解读(2)以字节方式上传文件的客户端代码的相关文章

FastDFS的配置、部署与API使用解读(3)以流的方式上传文件的客户端代码(转)

调用的API为: String[] upload_file( String group_name,//组名,不指定则可设为null long file_size,//文件大小,必须制定 UploadCallback callback,//回调 String file_ext_name, NameValuePair[] meta_list ) 1 /** 2 * Upload File to DFS, directly transferring java.io.InputStream to jav

FastDFS的配置、部署与API使用解读(8)FastDFS多种文件上传接口详解(转)

1.StorageClient与StorageClient1的区别 相信使用happy_fish的FastDFS的童鞋们,一定都熟悉StorageClient了,或者你熟悉的是StorageClient1,两者有什么区别呢? 我们在前面的几篇博文中已经知道,FastDFS存储文件时,是将 FastDFS存储到某个Group的某个Storage的某个路径下.如果你在Storage Server上设置的是两层目录结构的话,则一个文件上传到FastDFS后的File ID一般形如"group1/M01

FastDFS的配置、部署与API使用解读(1)Get Started with FastDFS

1.背景 FastDFS是一款开源的.分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发.该开源项目的主页是 http://code.google.com/p/fastdfs .可以通过fastdfs.sourceforge.net 下载.FastDFS论坛是 http://www.csource.org ,目前是指向 ChinaUnix 开源项目孵化平台的一个板块 FastDFS,网址为 bbs.chinaunix.net/forum-240-

FastDFS的配置、部署与API使用解读(5)FastDFS配置详解之Tracker配置

本文是 tracker.conf 配置文件的详细介绍. 1 基本配置 disable #func:配置是否生效 #valu:true.false disable=false bind_addr #func:绑定IP #valu:IP地址 bind_addr=192.168.6.102 port #func:服务端口 #valu:端口整数值 port=22122 connect_timeout #func:连接超时 #valu:秒单位正整数值 connect_timeout=30 network_

PHP安装FastDFS扩展,测试上传文件

PHP安装FastDFS扩展,测试上传文件 PHP所在服务器需先安装FastDFS.FastDFS安装方法如上,无需启动服务. 安装FastDFS扩展 # cd /usr/local/FastDFS/php_client/ # ls /opt/lampp/bin/phpize /opt/lampp/bin/phpize # /opt/lampp/bin/phpize Configuring for: PHP Api Version:         20121113 Zend Module Ap

Fastdfs 无法上传文件问题描述及解决方案

今开发反馈一问题,发现fastdfs中有两个组无法上传文件,简单测试了下: fdfs_upload_file /etc/fdfs/storage.conf /root/1.jpg 会返回给我N00~N02,N04,N06~N10但缺少了N03,N05 通过fdfs_monitor和监控(23000端口)都是没问题的,于是专门对比了N02和N03,N05的区别之处: 发现N02的磁盘: /dev/sdc1             3.6T  884G  2.6T  26% /data/M00 /d

FastDfs 学习进阶之环境安装及上传文件测试

一:环境介绍       10.63.13.138 tracker,nginx proxy 10.63.13.143 storage,nginx 二:资源包准备 FastDFS官方论坛:http://www.csource.org 资源下载路径:http://sourceforge.net/projects/fastdfs/files/ 本实验学习环境使用CENTOS 6.4 X64 需要下载的资源包: FastDFS源代码:FastDFS_v5.05.tar.gz nginx模块源代码:fas

ueditor1.4.3配置过程(包含单独上传文件以及图片的使用)

这里使用的是ueditor1.4.3的jsp版本的UTF-8版本. 首先下载相应的ueditor,将ueditor文件夹直接拷贝到项目中,文件结构如下所示: 然后将项目要用的jar包导入到lib目录下,在导入之前要先修改一下ueditor的jar包中的bug,这个可以参考这里点击打开链接 接着就是配置jsp目录下的config.json文件了,让它能适应我们的项目,配置内容如下: /* 前后端通信相关的配置,注释只允许使用多行方式 */ { /* 上传图片配置项 */ "imageActionN

HDFS基本命令行操作及上传文件的简单API

一.HDFS基本命令行操作: 1.HDFS集群修改SecondaryNameNode位置到hd09-2 (1)修改hdfs-site.xml <configuration> //配置元数据存储位置 <property> <name>dfs.namenode.name.dir</name> <value>/root/hd/dfs/name</value> </property> //配置数据存储位置 <property