前一篇文章( fastdfs+nginx安装配置 )介绍了fdfs
的配置,在浏览本文之前应该要有一台可用的fastdfs文件服务器。本文将介绍怎样使用fdfs java客户端来对文件进行操作。
fastdfs_client_v1.20.jar
和junit
,fastdfs java客户端的下载地址本文的最后会给出。 /** * 上传类路径下的"res/1.jpg"图片。 */
@Test
public void testUpload() throws Exception{
//获取项目路径下的配置文件"fdfs_client.conf"的路径
String configPath = this.getClass()
.getResource("/fdfs_client.conf").getFile();
/*初始化ClientGlobal的配置属性,因为ClientGlobal存放着所有的配置信息,所以这个方法必须要执行, 如果不执行,在允许的过程中会报空指针异常。*/
ClientGlobal.init(configPath);
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);
//存储在storage的元数据,可以存放一些与改文件相关的信息。
NameValuePair[] metaList = new NameValuePair[]{
new NameValuePair("description", "这是一张风景图")
};
String fileId = storageClient.upload_file1(this.getClass().getResource("/res/1.jpg").getFile(),
"jpg", metaList);
System.out.println(fileId);
}
ClientGlobal.init(configPath);
初始化了全局的配置属性,例如连接超时时间、网络超时时间、tracker服务地址等等,然后创建了一个TrackerClient
,通过这个TrackerClient
去查找一个可用的Tracker
服务器,再根据这个Tracker
服务器去查找Storage
服务器,然后再去创建一个StorageClient1
客户端,通过调用方法upload_file1
上传本地文件,最后返回文件id(包括组和文件名),上面返回的文件id是:group1/M00/00/00/wKjHglYve9mAY2PUAAEIGuXWGYw312.jpg
2. 下载文件
/** * 下载文件到C盘 */
@Test
public void testDownload() throws Exception{
String configPath = this.getClass()
.getResource("/fdfs_client.conf").getFile();
ClientGlobal.init(configPath);
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);
String fileId = "group1/M00/00/00/wKjHglYve9mAY2PUAAEIGuXWGYw312.jpg";
String localFileName = "c:/1.jpg";
//返回错误代码,0表示下载成功,其他表示下载失败。
int errorno = storageClient.download_file1(fileId, localFileName);
Assert.assertEquals(0, errorno);
}
前部分代码和前面基本类似,通过storageClient.download_file1(fileId, localFileName)
下载文件到指定文件。其实前部分的代码都是可以重用的,最后只有能得到StorageClient1
或者StorageClient
的实例就可以了
3. 删除文件
/** * 删除 */
@Test
public void testDelete() throws Exception {
String configPath = this.getClass()
.getResource("/fdfs_client.conf").getFile();
ClientGlobal.init(configPath);
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);
String fileId = "group1/M00/00/00/wKjHglYve9mAY2PUAAEIGuXWGYw312.jpg";
int errorno = storageClient.delete_file1(fileId);
Assert.assertEquals(0, errorno);
}
通过storageClient.delete_file1(fileId)
方法返回的值来判断文件是否成功删除(0表示成功,其他表示失败)
4. 获取文件信息
/** * 获取文件信息 */
@Test
public void testGetFileInfo() throws Exception {
String configPath = this.getClass()
.getResource("/fdfs_client.conf").getFile();
ClientGlobal.init(configPath);
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);
String fileId = "group1/M00/00/00/wKjHglYvf8eASMNUAAEIGuXWGYw203.jpg";
FileInfo fileInfo = storageClient.get_file_info1(fileId);
Assert.assertNotNull(fileInfo);
Date createDate = fileInfo.getCreateTimestamp();
long fileSize = fileInfo.getFileSize();
String ip = fileInfo.getSourceIpAddr();
System.out.println("文件信息{创建时间: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createDate)+
", 文件长度: "+fileSize+"B, 文件所上传的服务器ip地址: "+ip+"}" );
}
/** * 获取文件元数据 */
@Test
public void testGetMetaData() throws Exception {
String configPath = this.getClass()
.getResource("/fdfs_client.conf").getFile();
ClientGlobal.init(configPath);
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient1 storageClient = new StorageClient1(trackerServer, storageServer);
String fileId = "group1/M00/00/00/wKjHglYvgauAKwSXAAEIGuXWGYw767.jpg";
NameValuePair[] metaList = storageClient.get_metadata1(fileId);
Assert.assertNotNull(metaList);
for(NameValuePair meta : metaList) {
System.out.print(meta.getName() + ":" + meta.getValue());
}
System.out.println();
}
发现乱码了,前面添加的元数据信息是中文,所有需要进行URL
编解码:
NameValuePair[] metaList = new NameValuePair[]{
new NameValuePair("description", URLEncoder.encode("这是一张风景图", "UTF-8"))
};
URLDecoder.decode(meta.getValue(), "UTF-8")
6 其他方法,API还自带了许多其他方法,比如可以向某个已经上传的文件追加内容,还可以对上传文件进行截断,修改文件元数据,获取Tracker和Storage服务器信息等等,等需要的时候再去查API就可以了,基本的代码模式和上面很像,上面的代码有很多可以重用的地方。
总结:通过上面的API确实能很方便的实现我们想要的功能,但是我查看了一下API没发现可以查询所有的已经上传文件或者根据某些添加或者是时间来查询相关文件,有可能在实际的开发中要清除一些上传的文件垃圾(这些文件不再使用了,而现在却不知道哪些是垃圾,哪些是正在使用的文件)。作者提供的java API有点像C的写法,代码写的觉得有点不够优雅,不过也可以理解了。