1.构建springboot项目java
2.导入fastdfs依赖spring
<dependency> <groupId>net.arccode</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27.0</version> </dependency>
3.application.properties 添加fastdfs文件服务器配置springboot
fastdfs.trackerServer=192.168.1.180:22122 fastdfs.connectTimeout=5000 fastdfs.networkTimeout=30000 fastdfs.trackerHttpPort=8080 fastdfs.server.ip=192.168.1.180
4.读取application.properties 文件的fastdfs配置信息服务器
/** * @Author: Dell * @Date: 2018/12/3 * @Description: */ @Component public class FastDFSConfig { private String DEFAULT_CHARSET="UTF-8"; @Value(value = "${fastdfs.connectTimeout}") private Integer connectTimeout; @Value(value = "${fastdfs.networkTimeout}") private Integer networkTimeout; @Value(value = "${fastdfs.trackerHttpPort}") private Integer trackerHttpPort; @Value(value = "${fastdfs.trackerServer}") private String trackerServer; public FastDFSConfig() { } public Integer getConnectTimeout() { return connectTimeout; } public void setConnectTimeout(Integer connectTimeout) { this.connectTimeout = connectTimeout; } public Integer getNetworkTimeout() { return networkTimeout; } public void setNetworkTimeout(Integer networkTimeout) { this.networkTimeout = networkTimeout; } public Integer getTrackerHttpPort() { return trackerHttpPort; } public void setTrackerHttpPort(Integer trackerHttpPort) { this.trackerHttpPort = trackerHttpPort; } public String getTrackerServer() { return trackerServer; } public void setTrackerServer(String trackerServer) { this.trackerServer = trackerServer; } @Override public String toString() { return "FastDFSConfig{" + "connectTimeout=" + connectTimeout + ", networkTimeout=" + networkTimeout + ", trackerHttpPort=" + trackerHttpPort + ", trackerServer='" + trackerServer + '\'' + '}'; } }
5.配置fastdfds客户端app
/** * @Author: Dell * @Date: 2018/12/3 * @Description: */ @Configuration public class StorageClientConfig { private static final Logger logger = LoggerFactory.getLogger(StorageClientConfig.class); @Autowired private FastDFSConfig fastDFSConfig; @Bean public StorageClient storageClient() throws IOException, MyException { this.initClientGlobal(); TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); return new StorageClient(trackerServer, storageServer); } private void initClientGlobal() throws IOException, MyException { ClientGlobal.initByTrackers(fastDFSConfig.getTrackerServer()); if(fastDFSConfig.getTrackerHttpPort()!=null && fastDFSConfig.getTrackerHttpPort().intValue()!=0) { ClientGlobal.setG_tracker_http_port(fastDFSConfig.getTrackerHttpPort()); } if(fastDFSConfig.getConnectTimeout()!=null && fastDFSConfig.getConnectTimeout().intValue()!=0) { ClientGlobal.setG_connect_timeout(fastDFSConfig.getConnectTimeout()); } if(fastDFSConfig.getNetworkTimeout()!=null && fastDFSConfig.getNetworkTimeout().intValue()!=0) { ClientGlobal.setG_network_timeout(fastDFSConfig.getNetworkTimeout()); } } }
6.文件属性Bean,存放上传文件属性ide
/** * @Author: Dell * @Date: 2018/11/15 * @Description: */ public class FastDFSFileMeta { private String name; private byte[] content; private String ext; private String md5; private String author; private long fileSize; public FastDFSFileMeta() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public byte[] getContent() { return content; } public void setContent(byte[] content) { this.content = content; } public String getExt() { return ext; } public void setExt(String ext) { this.ext = ext; } public String getMd5() { return md5; } public void setMd5(String md5) { this.md5 = md5; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public long getFileSize() { return fileSize; } public void setFileSize(long fileSize) { this.fileSize = fileSize; } @Override public String toString() { return "FastDFSFileMeta{" + "name='" + name + '\'' + ", content=" + Arrays.toString(content) + ", ext='" + ext + '\'' + ", md5='" + md5 + '\'' + ", author='" + author + '\'' + ", fileSize=" + fileSize + '}'; } }
7.文件属性构造器工具
/** * @Author: Dell * @Date: 2018/11/16 * @Description: */ public class FastDFSFileMetaBuilder { /** * 根据上传附件构造FastDFSFileMeta * @param file * @return * @throws IOException */ public static FastDFSFileMeta build(MultipartFile file) throws IOException { if(file == null) { return null; } FastDFSFileMeta meta = new FastDFSFileMeta(); meta.setContent(file.getBytes()); meta.setName(file.getOriginalFilename()); meta.setExt(file.getOriginalFilename().substring(file.getOriginalFilename().indexOf(".")+1)); meta.setFileSize(file.getSize()); return meta; } public static FastDFSFileMeta buildBigFile(MultipartFile file) { if(file == null) { return null; } FastDFSFileMeta meta = new FastDFSFileMeta(); meta.setName(file.getOriginalFilename()); meta.setExt(file.getOriginalFilename().substring(file.getOriginalFilename().indexOf(".")+1)); meta.setFileSize(file.getSize()); return meta; } public static FastDFSFileMeta build(File file) throws IOException { if(file == null) { return null; } FastDFSFileMeta meta = new FastDFSFileMeta(); meta.setName(file.getName()); meta.setExt(file.getName().substring(file.getName().indexOf(".")+1)); meta.setFileSize(file.length()); InputStream in = null; try { in = new FileInputStream(file); byte[] bytes = new byte[in.available()]; in.read(bytes); meta.setContent(bytes); } finally { if(in!=null) { in.close(); } } return meta; } public static FastDFSFileMeta buildBigFile(File file) throws IOException { if(file == null) { return null; } FastDFSFileMeta meta = new FastDFSFileMeta(); meta.setName(file.getName()); meta.setExt(file.getName().substring(file.getName().indexOf(".")+1)); meta.setFileSize(file.length()); return meta; } }
8.FastDFS 工具类ui
/** * FastDFS 工具类 * @Author: Dell * @Date: 2018/12/3 * @Description: */ @Component public class FastDFSClient { private static final Logger logger = LoggerFactory.getLogger(FastDFSClient.class); @Autowired private StorageClient storageClient; public String[] upload(File file, FastDFSFileMeta meta) { logger.debug("文件上传[fileMeta={}]", meta); // 文件属性 NameValuePair[] metas = new NameValuePair[1]; metas[0] = new NameValuePair("author", meta.getAuthor()); String[] results = null; try { results = storageClient.upload_file(file.getPath(), meta.getExt(), metas); } catch (IOException e) { logger.error("文件上传错误file={}", meta.getName(), e); } catch (Exception e) { logger.error("文件上传错误file={}", meta.getName(), e); } if (results==null || results.length!=2) { logger.error("文件上传错误[error code={}]", storageClient.getErrorCode()); return null; } logger.debug("文件上传成功[group_name={}, remoteFileName={}]", results[0], results[1]); return results; } /** * 文件上传 * @param meta * @return */ public String[] upload(FastDFSFileMeta meta) { logger.debug("文件上传[fileMeta={}]", meta); // 文件属性 NameValuePair[] metas = new NameValuePair[1]; metas[0] = new NameValuePair("author", meta.getAuthor()); String[] results = null; try { results = storageClient.upload_file(meta.getContent(), meta.getExt(), metas); } catch (IOException e) { logger.error("文件上传错误file={}", meta.getName(), e); } catch (Exception e) { logger.error("文件上传错误file={}", meta.getName(), e); } if (results==null || results.length!=2) { logger.error("文件上传错误[error code={}]", storageClient.getErrorCode()); return null; } logger.debug("文件上传成功[group_name={}, remoteFileName={}]", results[0], results[1]); return results; } /** * 读取文件元数据 * @param groupName * @param remoteFileName * @return */ public FileInfo fileMeta(String groupName, String remoteFileName) { try { logger.debug("读取文件元数据[groupName={}, remoteFileName={}]", groupName, remoteFileName); return storageClient.get_file_info(groupName, remoteFileName); } catch (IOException e) { logger.error("读取文件元数据错误", e); } catch (Exception e) { logger.error("读取文件元数据错误", e); } return null; } /** * 文件下载 * @param groupName * @param remoteFileName * @return */ public InputStream download(String groupName, String remoteFileName) { try { logger.debug("文件下载[groupName={}, remoteFileName={}]", groupName, remoteFileName); byte[] fileByte = storageClient.download_file(groupName, remoteFileName); InputStream ins = new ByteArrayInputStream(fileByte); return ins; } catch (IOException e) { logger.error("文件下载错误", e); } catch (Exception e) { logger.error("文件下载错误", e); } return null; } /** * 文件删除 * @param groupName * @param remoteFileName * @return * @throws IOException * @throws MyException */ public int delete(String groupName, String remoteFileName) throws IOException, MyException { logger.debug("文件删除[groupName={}, remoteFileName={}]", groupName, remoteFileName); return storageClient.delete_file(groupName, remoteFileName); } }