一、导包
注意:maven中央仓库并没有这个依赖,需要自行寻找资源并安装到本地maven仓库,才能正常使用下方的依赖
<dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.25</version> </dependency>
cmd下安装依赖:
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=1.25 -Dpackaging=jar -Dfile=D:\fastdfs_client-1.25.jar
pom.xml
<!--commons-io--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <!--fastdfs客户端--> <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.25</version> </dependency> <!--日志--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency>
二、操作API
在src/main/resources下创建配置文件。
log4j.properties
log4j.rootLogger=info, ServerDailyRollingFile, stdout log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd log4j.appender.ServerDailyRollingFile.File=logs/notify-subscription.log log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n log4j.appender.ServerDailyRollingFile.Append=true log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%l] %m%n
fdfs_client.conf
# 连接tracker服务器超时时长 connect_timeout = 10 # socket连接超时时长 network_timeout = 30 # 文件内容编码 charset = UTF-8 # Tracker Server提供HTTP服务的端口 # 与安装时tracker.conf的port值一致 http.tracker_http_port = 22122 # 防盗链Token http.anti_steal_token = no # 密钥, 随便写 http.secret_key = FastDFS1234567890 # tracker服务器IP和端口(可以写多个) tracker_server = 192.168.178.7:22122 tracker_server = 192.168.178.10:22122
FastDFS文件上传下载工具类
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.csource.common.NameValuePair; import org.csource.fastdfs.*; import java.io.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * @Description FastDFS文件上传下载工具类 */ public final class FastDFSClient { private static final Logger logger = Logger.getLogger(FastDFSClient.class); /*直接放在类路径下, 不能在前面加入 / 符号(/fdfs_client.conf) */ private static final String CONFIG_FILENAME = "fdfs_client.conf"; private static StorageClient1 storageClient1 = null; static { try { //加载连接信息 ClientGlobal.init(CONFIG_FILENAME); //创建TrackerClient对象 TrackerClient trackerClient = new TrackerClient(); //获取TrackerServer对象 TrackerServer trackerServer = trackerClient.getConnection(); if (trackerServer == null) { throw new IllegalStateException("getConnection return null"); } //创建StorageServer对象 StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); if (storageServer == null) { throw new IllegalStateException("getStoreStorage return null"); } //使用TrackerServer和StorageServer构造StorageClient对象 storageClient1 = new StorageClient1(trackerServer,storageServer); } catch (Exception e) { logger.error("创建storage client失败:" + e); } } private FastDFSClient(){} /** * 上传文件 * @param file 文件对象 * @param fileName 文件名 * @return */ public static String uploadFile(File file, String fileName) { return uploadFile(file,fileName,null); } /** * 上传文件 * @param file 文件对象 * @param fileName 文件名 * @param metaList 文件元数据 * @return */ public static String uploadFile(File file, String fileName, Map<String,String> metaList) { try { byte[] buff = IOUtils.toByteArray(new FileInputStream(file)); NameValuePair[] nameValuePairs = null; if (metaList != null) { nameValuePairs = new NameValuePair[metaList.size()]; int index = 0; for (Iterator<Map.Entry<String,String>> iterator = metaList.entrySet().iterator(); iterator.hasNext();) { Map.Entry<String,String> entry = iterator.next(); String name = entry.getKey(); String value = entry.getValue(); nameValuePairs[index++] = new NameValuePair(name,value); } } return storageClient1.upload_file1(buff, FilenameUtils.getExtension(fileName), nameValuePairs); } catch (Exception e) { logger.error("上传文件失败:" + e); } return null; } /** * 获取文件元数据 * @param fileId 文件ID * @return */ public static Map<String,String> getFileMetadata(String fileId) { try { NameValuePair[] metaList = storageClient1.get_metadata1(fileId); if (metaList != null) { HashMap<String,String> map = new HashMap<String, String>(); for (NameValuePair metaItem : metaList) { map.put(metaItem.getName(),metaItem.getValue()); } return map; } } catch (Exception e) { logger.error("获取文件元数据失败:" + e); } return null; } /** * 删除文件 * @param fileId 文件ID * @return 删除失败返回-1,否则返回0 */ public static int deleteFile(String fileId) { try { return storageClient1.delete_file1(fileId); } catch (Exception e) { logger.error("删除文件失败:" + e); } return -1; } /** * 下载文件 * @param fileId 文件ID(上传文件成功后返回的ID) * @param outFile 文件下载保存位置 * @return */ public static int downloadFile(String fileId, File outFile) { FileOutputStream fos = null; ByteArrayInputStream in = null; try { byte[] content = storageClient1.download_file1(fileId); in = new ByteArrayInputStream(content, 1, content.length); fos = new FileOutputStream(outFile); IOUtils.copy(in,fos); return 0; } catch (Exception e) { logger.error("下载文件失败:" + e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { logger.error("下载文件完毕后, 关闭输入流失败" + e); } } if (fos != null) { try { fos.close(); } catch (IOException e) { logger.error("下载文件完毕后, 关闭输出流失败" + e); } } } return -1; } }