一,Java操作FastDFS API
java单独操作FastDFS一般使用自定义打包的方式,当然也使用maven中央仓库的依赖,因为maven中央仓库版本有滞后性,一般使用自定义安装导入源码包的方式
一,打包fastdfs-client-java并安装到本地maven仓库
方式一:使用maven命令进行源码安装(需要提前安装配置Maven)
① 下载fastdfs-client-java源码包
下载地址:https://github.com/happyfish100/fastdfs-client-java/releases
② 解压源码包
③ 使用maven提供的mvn clean install命令
#打开cmd窗口进入源码的根目录,运行命令
mvn clean install
方式二:使用maven命令进行jar包安装
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=${version} -Dpackaging=jar -Dfile=fastdfs-client-java-${version}.jar
-DgroupId:设置项目代码的包名(一般用组织名)
-DartifactId:设置项目名或模块名
-Dversion :版本号
-Dpackaging : 什么类型的文件(jar包)
-Dfile : 指定jar文件路径与文件名(同目录下只需文件名
方式三:使用IDEA打包安装
使用IDEA打开该项目,点击install即可
检查:安装完成后maven的本地仓库中会存在该依赖文件
二,java操作FastDFS实现文件的上传,下载,删除
java操作FastDFS是比较简单的,只依赖storageclient对象进行上传,下载,删
获取StorageClient对象:
//引入配置文件,并初始化
ClientGlobal.init("fastdfs.conf");
//获取Tracker客户端对象
TrackerClient trackerClient = new TrackerClient();
//获取Trackerserver对象
TrackerServer trackerServer = trackerClient.getTrackerServer();
/*获取Storageserver对象,它依赖于tracker对象
* 参数:
* TrackerServer trackerServer:Trackerserver对象
* */
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
/*定义Storage客户端对象,通过这个对象实现文件的上传,下载,删除等操作(关键对象)
* 需要传入的参数:
* 1,TrackerServer trackerServer:Tracker服务对象
* 2,StorageServer storageServer:Storage服务对象
* */
StorageClient storageClient = new StorageClient(trackerServer,storageServer);
一,文件上传
通过storageClient.upload_file实现文件上传
upload_file的重载方法:
upload_file(String local_filename, String file_ext_name, NameValuePair[] meta_list):适合java本地文件上传
upload_file(byte[] file_buff, String file_ext_name, NameValuePair[] meta_list):适合web文件上传
String[] upload_file(String group_name, byte[] file_buff, int offset, int length, String file_ext_name, NameValuePair[] meta_list)
upload_file(String group_name, byte[] file_buff, String file_ext_name, NameValuePair[] meta_list)
……
参数:
String local_filename:上传的本地文件
String file_ext_name:文件的后缀名
byte[] file_buff:文件流对象
NameValuePair[] meta_list:文件属性,一般不用
String group_name:组名
例:
//文件上传
public void upload() throws IOException, MyException {
ClientGlobal.init("fastdfs.conf");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient storageClient = new StorageClient(trackerServer,storageServer);
/*文件上传:使用StorageClient类的upload_file方法
*1,local_filename:上传文件路径
*2,file_ext_name:文件后缀名
*3,meta_list:文件的属性文件(通常不用)
* 返回值为String[]类型,返回的属性非常重要(group和访问地址),这个属性一般保存再数据库中
* */
String[] up_meta = storageClient.upload_file("fq.jpg","jpg",null);
//将属性进行打印group,访问地址
for (String a:up_meta){
System.out.println(a);
}
//关闭storage客户端
storageClient.close();
}
二,文件下载
通过storageClient.download_file实现文件上传
download_file的重载方法:
byte[] download_file(String group_name, String remote_filename)
int download_file(String group_name, String remote_filename, String local_filename)
int download_file(String group_name, String remote_filename, DownloadCallback callback)
……
参数:
String group_name:组名
String remote_filename:远程文件地址
String local_filename:下载后的文件名
DownloadCallback callback:回调方法
例:
//文件下载
public void download() throws IOException, MyException {
//前面部分是一样的,没有进行提前了
ClientGlobal.init("fastdfs.conf");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient storageClient = new StorageClient(trackerServer,storageServer);
//组名
String group = "group1";
//地址
String remote = "M00/00/00/wKhEhWFpboSABPB4AABGckhMKZw455.jpg";
//下载到本地的文件名
String filename = "wql.jpg";
/*使用download_file进行文件的下载,这种方法重载也挺多,有返回值为byte和int的,这里使用的是返回值为int类型的
* String group_name:远程文件的组名
* String remote_filename:文件地址
* String local_filename:保存到本地的文件路径和文件名
* */
int a = storageClient.download_file(group,remote,filename);
//假如a为0就为失败,否则反正
if(a!=0){
System.out.println("下载成功!");
}
storageClient.close();
}
三,文件的删除
通过storageClient.download_file实现文件上传,它没有重载方法
方法:int delete_file(String group_name, String remote_filename)
参数:
String group_name:组名
String remote_filename:远程路径
例:
//删除文件
public void delete_remote_file() throws IOException, MyException {
ClientGlobal.init("fastdfs.conf");
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getTrackerServer();
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
StorageClient storageClient = new StorageClient(trackerServer,storageServer);
//组名
String group = "group1";
//地址
String remote = "M00/00/00/wKhEhWFpboSABPB4AABGckhMKZw455.jpg";
/*delete_file没有重载方法
* 参数:
* String group_name:组名
* String remote_filename:地址
* */
int a = storageClient.delete_file(group,remote);
if(a!=0){
System.out.println("删除成功");
}
storageClient.close();
}
二,SpringBoot整合FastDFS API操作
因为之前本地打包安装进maven的方式用过了,所有springboot操作fastdfs使用远程maven仓库的fastdfs-client依赖
一,环境搭建
① 新建一个SpringBoot项目(省略)
② 引入FastDFS的pom依赖(Maven远程仓库依赖,没有使用手动编译安装的依赖)
<!-- https://mvnrepository.com/artifact/com.github.tobato/fastdfs-client -->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
③ 配置yml文件(fdfs的配置是有点多的,下面只写了几个重要的)
#fdfs的配置
fdfs:
#文件上传超时时间
so-timeout: 1500
#连接的超时时间
connect-timeout: 600
#tracker的地址(可以写多个)
tracker-list:
- 192.168.68.133:22122
④ 再main方法上引入Fdfsclient配置类
@SpringBootApplication
@Import(FdfsClientConfig.class)//映引入入Fdfsclient的配置类
public class SpringbootFastdfsDomeApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootFastdfsDomeApplication.class, args);
}
}
二,Spring操作FastDFS上传,下载,删除
SpringBoot操作FastDFS不需要需要像原生java操作那样手动创建TrackerServer,StorageServer,再通过这两个对象创建一个StorageClient实现功能
项目配置后,操作FastDFS是非常简单的,只需要注入一个FastFileStorageClient对象,通过这个对象就可以实现上传,下载,删除
注:使用SpringBoot注入的FastFileStorageClient对象操作,和原生的API是有些区别的,并不一样
一,文件的上传
通过fileStorageClient.uploadFile和fileStorageClient.uploadImage()实现文件上传(后者主要上传图片)
重载方法:
StorePath uploadFile(InputStream inputStream, long fileSize, String fileExtName, Set<MetaData> metaDataSet)
StorePath uploadImageAndCrtThumbImage(InputStream inputStream, long fileSize, String fileExtName, Set<MetaData> metaDataSet)
StorePath uploadImage(FastImageFile fastImageFile)
StorePath uploadFile(FastFile fastFile)
参数:
InputStream inputStream:上传文件的输入流(它没有提供通过文件名直接上传的方法)
long fileSize:文件大小(通过file.length()获取即可)
String fileExtName:文件后缀名
Set<MetaData> metaDataSet:元数据信息,set集合
FastFile fastFile:上传文件对象,这个对象用来封装上传信息
1,FastFile类
FastFile(InputStream inputStream, long fileSize, String fileExtName, Set<MetaData> metaDataSet)
InputStream inputStream:上传文件的输入流(它没有提供通过文件名直接上传的方法)
long fileSize:文件大小(通过file.length()获取即可)
String fileExtName:文件后缀名
Set<MetaData> metaDataSet:元数据信息,set集合
2,MetaData类
这个类有两个全局变量,name和value(属性名和属性值),通过设置这两个值进行元数据设置
构造指定:public MetaData(String name, String value)
方法:
getName():获取属性名
getValue():获取属性值
setName(String name):设置属性名
setValue(String value):设置属性值
3,StorePath类
方法:
getGroup():获取组名
setPath(String path):设置组名
String getPath():获取上传后的地址
setPath(String path):设置上传后的地址
getFullPath():获取全路径(group+path)
上传测试:
@Test//文件上传
void file_upload() throws FileNotFoundException {
//设置文件的元数据信息
MetaData metaData =new MetaData("file_name","wql.jpg");
Set<MetaData> set = new HashSet<>();
set.add(metaData);
//读取上传文件的输入流
File file =new File("wql.jpg");
FileInputStream inputStream = new FileInputStream(file);
/*上传文件类
* 参数:
* InputStream inputStream:上传文件的输入流
* long fileSize: 上传文件的大小,通过file.length()方法获取即可
* String fileExtName: 文件的后缀名
* Set<MetaData> metaDataSet:文件的元数据信息
* */
FastFile fastFile =new FastFile(inputStream,file.length(),"jpg",set);
StorePath storePath = fileStorageClient.uploadFile(fastFile);
System.out.println(storePath.getFullPath());
System.out.println(storePath.getGroup());
System.out.println(storePath.getPath());
}}
二,文件的下载
通过 fileStorageClient.downloadFile方法实现文件的下载,它有两个重载方法
重载方法:
downloadFile(String groupName, String path, DownloadCallback<T> callback)
downloadFile(String groupName, String path, long fileOffset, long fileSize, DownloadCallback<T> callback)
参数:
String groupName:下载文件的组
String path:下载文件的地址
DownloadCallback<T> callback:回调方法(这个非常重要,它决定返回值)
1,DownloadCallback<T>接口
这个接口有三个实现类
DownloadFileWriter:指定下载文件名,返回值为String
DownloadFileStream:指定一个输出流,返回值我一个缓冲输出流
DownloadByteArray:无有参构造,返回值为byte数组
① DownloadFileWriter类
指定下载后的文件名,内部进行下载,返回值为String
构造:DownloadFileWriter(String fileName)
② DownloadFileStream类
构造:DownloadFileStream(OutputStream responseOutputStream)
③ DownloadByteArray
下载测试:
@Test//文件下载
void file_download() throws IOException {
/*上传方法
* 参数:
* String groupName:文件的组名
* String path:文件的地址
* DownloadCallback<T> callback:上传文件的回调
* */
byte[] bytes = fileStorageClient.downloadFile("group1", "M00/00/00/wKhEhWFqgqGAYRfkAAJdc7kXBfI862.jpg", new DownloadByteArray());
byte[] bufferedInputStream = fileStorageClient.downloadFile("", "", new DownloadByteArray());
File file =new File("FQ_love_WQL.jpg");
FileOutputStream fileOutputStream =new FileOutputStream(file);
fileOutputStream.write(bytes);
}
三,文件的删除
文件删除很简单,通过fileStorageClient.deleteFile,无重载方法
方法:void deleteFile(String groupName, String path)
String groupName:下载文件的组
String path:下载文件的地址
注:无返回值不能直接判断删除是否成功
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109