Spring Boot集成FastDFS

1.因为fastdfs-client-java依赖包在maven中央仓库无法取得,所以需要到https://github.com/happyfish100/fastdfs-client-java进行下载,

2.下载后解压fastdfs-client-java-master.zip

3.运行CMD,切换至解压出来的fastdfs-client-java-master文件夹

mvn clean install

4.出现下图表示导入成功

5.在项目的pom.xml文件中增加

<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.29-SNAPSHOT</version>
</dependency>

6.在项目resources文件夹下创建fdfs_client.conf文件

#默认值为30s
connect_timeout = 10
#默认值为30s
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8080
# token 防盗链功能
http.anti_steal_token = true
http.secret_key = ZFnWLBqrX3
#fastdfs.tracker_servers=192.168.14.132:22122,192.168.14.133:22122
tracker_server = 192.168.14.200:22122        
#若采用keepalived,则指向虚拟ip。否则采用下面两行的形式
#tracker_server = 192.168.14.133:22122
#tracker_server = 192.168.14.132:22122
## Tracker Server, if more than one, separate with ","
#fastdfs.tracker_servers=${tracker_server_addr}:22122

7.编辑文件服务器上的/etc/fdfs/http.conf


#设置为true表示开启token验证
http.anti_steal.check_token=false

#设置token失效的时间单位为秒(s)
http.anti_steal.token_ttl=1800

#密钥,跟客户端配置文件的fastdfs.http_secret_key保持一致
http.anti_steal.secret_key=FASTDFS1234567890

#如果token检查失败,返回的页面,该文件必须存在,否则报错
http.anti_steal.token_check_fail=/usr/local/fail.jpg

8.封装FastDFS上传工具类

package FastDFSUtils;

import baseUtils.MyException;
import baseUtils.ResultEnum;
import baseUtils.ResultVO;
import baseUtils.ResultVOUtil;
import org.csource.common.IniFileReader;
import org.csource.fastdfs.*;
import org.csource.common.NameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;


public class FastDFSClient {

    private final static Logger logger  = LoggerFactory.getLogger(FastDFSClient.class);

    //文件系统初始化
    static {
        try {
            String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
            IniFileReader iniReader = new IniFileReader(filePath);
            String[] szTrackerServers = iniReader.getValues("tracker_server");
            ClientGlobal.init(filePath);
        } catch (Exception e) {
            throw new MyException(ResultEnum.FAST_DFS_ERROR);
        }
    }

    /**
     * 文件上传
     * @param file 自定义文件上传类
     * @return
     */
    public static String upload(FastDFSFile file){
        NameValuePair[] meta_list = new NameValuePair[1];
        meta_list[0] = new NameValuePair("author", file.getAuthor());
        long startTime = System.currentTimeMillis();
        String[] uploadResults = null;
        StorageClient storageClient=null;
        try {
            storageClient = getTrackerClient();
            //upload_file()三个参数:@param fileContent ①:文件的内容,字节数组 ②:文件扩展名 ③文件扩展信息 数组
            uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
        }catch (Exception e){
            e.printStackTrace();
            throw new MyException(ResultEnum.FAST_DFS_ERROR);
        }
        if (uploadResults == null && storageClient!=null) {
            logger.error("upload file fail, error code:" + storageClient.getErrorCode());
        }
        logger.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");
        String groupName = uploadResults[0];
        String remoteFileName = uploadResults[1];
        return groupName+"/"+remoteFileName;
    }

    /**
     * 查询文件信息
     * @param groupName
     * @param remoteFileName
     * @return
     */
    public static FileInfo getFile(String groupName, String remoteFileName) {
        try {
            StorageClient storageClient = getTrackerClient();
            return storageClient.get_file_info(groupName, remoteFileName);
        } catch (IOException e) {
            logger.error("IO Exception: Get File from Fast DFS failed", e);
        } catch (Exception e) {
            logger.error("Non IO Exception: Get File from Fast DFS failed", e);
        }
        return null;
    }

    /**
     * 下载文件
     * @param groupName 文件路径
     * @param remoteFileName 输出流 中包含要输出到磁盘的路径
     * @return
     */
    public static InputStream downFile(String groupName, String remoteFileName) {
        try {
            StorageClient storageClient = getTrackerClient();
            byte[] fileByte = storageClient.download_file(groupName, remoteFileName);
            InputStream ins = new ByteArrayInputStream(fileByte);
            return ins;
        } catch (IOException e) {
            logger.error("IO Exception: Get File from Fast DFS failed", e);
        } catch (Exception e) {
            logger.error("Non IO Exception: Get File from Fast DFS failed", e);
        }
        return null;
    }

    /**
     * 删除文件
     * ==0表示成功
     * @param groupName 组名 如:group1
     * @param remoteFileName 不带组名的路径名称 如:M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg
     * @throws Exception
     */
    public static int deleteFile(String groupName, String remoteFileName)
            throws Exception {
        StorageClient storageClient = getTrackerClient();
        return storageClient.delete_file(groupName, remoteFileName);
    }

    /**
     * 获取storage
     * @param groupName 组名
     * @return
     * @throws IOException
     */
    public static StorageServer[] getStoreStorages(String groupName){
        try {
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getTrackerServer();
            return trackerClient.getStoreStorages(trackerServer, groupName);
        }catch (Exception e){
            throw new MyException(ResultEnum.FAST_DFS_ERROR);
        }
    }

    /**
     *
     * @param groupName
     * @param remoteFileName
     * @return
     * @throws IOException
     */
    public static ServerInfo[] getFetchStorages(String groupName,String remoteFileName){
        try {
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getTrackerServer();
            return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
        }catch (Exception e){
            throw new MyException(ResultEnum.FAST_DFS_ERROR);
        }
    }

    /**
     * 获取reacker地址
     * @return
     * @throws IOException
     */
    public static String getTrackerUrl() throws IOException {
        return "http://"+getTrackerServer().getInetSocketAddress().getHostString()+":"+ ClientGlobal.getG_tracker_http_port()+"/";
    }

    /**
     * 获取tracker连接
     * @return
     * @throws IOException
     */
    private static StorageClient getTrackerClient() throws IOException {
        TrackerServer trackerServer = getTrackerServer();
        StorageClient storageClient = new StorageClient(trackerServer, null);
        return  storageClient;
    }

    /**
     * 获取tracker服务
     * @return
     * @throws IOException
     */
    private static TrackerServer getTrackerServer() throws IOException {
        TrackerClient trackerClient = new TrackerClient();
        TrackerServer trackerServer = trackerClient.getTrackerServer();
        return  trackerServer;
    }
}

9.FastDFSFile.java

package FastDFSUtils;

public class FastDFSFile {

    private String name;//文件名
    private byte[] content; //文件的内容,字节数组
    private String ext; //文件扩展名,不包含(.)
    private String md5; //加密
    private String author;

    public FastDFSFile() {
    }

    public FastDFSFile(String name, byte[] content, String ext) {
        this.name = name;
        this.content = content;
        this.ext = ext;
    }

    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;
    }
}

10.UploadDFS.java

package FastDFSUtils;

import baseUtils.MyException;
import baseUtils.ResultEnum;
import baseUtils.ResultVO;
import baseUtils.ResultVOUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

@RestController
@SpringBootApplication
public class UploadDFS {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @PostMapping("/UploadDFS.action")
    public Object FileUpload(HttpServletRequest request) throws Exception{
	    logger.info("UploadDFS");
	    List<Map<String,String>> result=new ArrayList<Map<String,String>>();
    	//允许上传的文件类型
        String fileType = "jpg,jpeg,bmp,png,xls,xlsx,doc,docx,ppt,pptx,text,txt,pdf,mp4,zip,7z";
	    List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
        if(files.size()==0){
            throw new MyException(ResultEnum.FILE_DATA_EMPTY);
        }
        int IsSuccess=1;
	    for (int i = 0; i < files.size(); i++) {
	        MultipartFile file = files.get(i);
	        String fileName = file.getOriginalFilename();
	        //获取文件后缀名
            String extName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase().trim();
            //判断是否为允许上传的文件类型
            if ( !Arrays.<String> asList(fileType.split(",")).contains(extName))
            {
                IsSuccess=0;
            }
	    }
	    if(IsSuccess==0){
	        throw new MyException(1036,"仅支持jpg,jpeg,bmp,png,xls,xlsx,doc,docx,ppt,pptx,text,txt,pdf,mp4,zip,7z格式的文件");
	    }
	    for (int i = 0; i < files.size(); i++) {
	        MultipartFile file = files.get(i);
	        String fileName = file.getOriginalFilename();
	        //获取文件后缀名
            String extName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase().trim();
            String oldName=fileName.substring(0,fileName.lastIndexOf("."));
            try {
                String path = saveFile(file);
                Map<String,String> data=new HashMap<String,String>();
                data.put("Url",path);
                String newFileName=path.substring(path.lastIndexOf("/")+1);
                data.put("FileName",newFileName);
                data.put("oldName",oldName);
                data.put("extName",extName);
                result.add(data);
            } catch (MyException e){
                throw e;
            }catch (Exception e) {
            	throw new MyException(1037,"文件\""+fileName+"\"上传失败");
            }
        }
        return ResultVOUtil.success(result);
    }

    /**
     * @param multipartFile
     * @return
     * @throws IOException
     */
    public String saveFile(MultipartFile multipartFile) throws IOException {
        String fileName=multipartFile.getOriginalFilename();
        String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
        byte[] file_buff = null;
        InputStream inputStream=multipartFile.getInputStream();
        if(inputStream!=null){
            int len1 = inputStream.available();
            file_buff = new byte[len1];
            inputStream.read(file_buff);
        }
        inputStream.close();
        FastDFSFile file = new FastDFSFile(fileName, file_buff, ext);
        return FastDFSClient.upload(file);
    }
}

本文参考了以下链接,感谢原文作者:

https://www.cnblogs.com/zeussbook/p/10764086.html

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值