Fastdfs分布式文件服务器案例
一:添加依赖
<!--fastdfs--> <dependency> <groupId>cn.bestwu</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27</version> </dependency> <!--用来获取文件扩展名的包--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency>
二:resources下添加配置文件fdfs_client.conf
tracker_server=fastdfs服务器端口
#访问直接使用域名,可省略80端口
三:编写FastdfsUtil类
package cn.ybl.basic.util; import org.csource.fastdfs.*; /** * @Author Mr.Yang * @createTime 2022/7/24 16:21 * @Describe FastDfs工具类 */ public class FastDfsUtils { //从classpath:resources中的内容最终会编译到classpath下 public static String CONF_FILENAME = FastDfsUtils.class.getClassLoader() .getResource("fdfs_client.conf").getFile(); /** * 上传文件 * @param file * @param extName:文件的后缀 file:上传文件的byte字节 * @return */ public static String upload(byte[] file,String extName) { try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); String fileIds[] = storageClient.upload_file(file,extName,null); System.out.println(fileIds.length); System.out.println("组名:" + fileIds[0]); System.out.println("路径: " + fileIds[1]); // /group1/M00/00/09/rBEACmKXF8-AUc6KAANsldwx3H4713.jpg return "/"+fileIds[0]+"/"+fileIds[1]; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 上传文件 * @param extName * @return */ public static String upload(String path,String extName) { try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); String fileIds[] = storageClient.upload_file(path, extName,null); System.out.println(fileIds.length); System.out.println("组名:" + fileIds[0]); System.out.println("路径: " + fileIds[1]); return "/"+fileIds[0]+"/"+fileIds[1]; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 下载文件 * @param groupName * @param fileName * @return */ public static byte[] download(String groupName,String fileName) { try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); byte[] b = storageClient.download_file(groupName, fileName); return b; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 删除文件 * @param groupName * @param fileName */ public static void delete(String groupName,String fileName){ try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); int i = storageClient.delete_file(groupName,fileName); System.out.println( i==0 ? "删除成功" : "删除失败:"+i); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("删除异常,"+e.getMessage()); } } }
四:前端上传文件组件发送请求(这里使用的是elementui)
<el-form-item label="Logo" prop="logo"> <el-upload class="upload-demo" action="http://localhost:8080/fastDfs/" :on-preview="handlePreview" :on-remove="handleRemove" :on-success="handleSuccess" :file-list="fileList" list-type="picture"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </el-form-item>
五:后台处理数据
package cn.ybl.basic.controller; import cn.ybl.basic.util.AjaxResult; import cn.ybl.basic.util.FastDfsUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; /** * @Author Mr.Yang * @createTime 2022/7/24 16:26 * @Describe FastDfs上传接口 */ @RestController @RequestMapping("/fastDfs") public class FastDfsController { /** * 上传 @RequestPart:接收文件 * required = true:必须上传一个图片 * @param file * @return AjaxResult */ @PostMapping public AjaxResult upload(@RequestPart(required = true,value = "file")MultipartFile file){ try { //获取上传文件的全名 String originalFilename = file.getOriginalFilename(); //substring:截取上传文件名(含头不含尾),获取后缀,extName即jpg/png String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); //调用方法上传,返回上传文件的路径filePath String filePath = FastDfsUtils.upload(file.getBytes(), extName); //将filePath返回给前端 return AjaxResult.getResult().setResultObj(filePath); } catch (Exception e) { e.printStackTrace(); return AjaxResult.getResult().setMsg("上传失败,请稍后重试"); } } /** * 删除图片 @RequestParam:key-value形式传参取值 * @param path * @return */ @DeleteMapping public AjaxResult delete(@RequestParam(value = "path",required = true) String path){ //path:/goup1/xxxxx/yyyy try { //从下标1开始截取,截取后:goup1/xxxxx/yyyy.jpg String pathTmp = path.substring(1); //截取后:substring = group1 String substring = pathTmp.substring(0, pathTmp.indexOf("/")); //截取后:substring1 = xxxxx/yyyy.jpg String substring1 = pathTmp.substring(pathTmp.indexOf("/") + 1); //调用工具类的删除方法 FastDfsUtils.delete(substring,substring1); return AjaxResult.getResult(); } catch (Exception e) { e.printStackTrace(); return AjaxResult.getResult().setMsg("删除失败,请稍后重试"); } } }

浙公网安备 33010602011771号