FastDFS的详细安装步骤三(亲搭--搭建时间2019年4月17号前后)

文章链接:

FastDFS的详细安装步骤一

FastDFS的详细安装步骤二

前言:

前两篇我们分别把FastDFS基本模块和FastDFS+nginx都搭建完成,既然图片服务器搭建好啦,那么我们就该开始结合到项目里用java代码来实际操作上传图片啦。这篇文章主要讲解springboot整合FastDFS_Client来完成上传文件的功能。

正文:

现在网上基本上就三种方法把FastDFS_Client集成到项目里:

第一种是下载fastdfs-client-java-master源码包打包引入到项目里

第二种是直接在pom文件里加上网上分享的依赖的maven坐标

一、这里讲解的就是直接依赖网上的maven坐标,添加依赖

<dependency>
    <groupId>com.github.tobato</groupId>
    <artifactId>fastdfs-client</artifactId>
    <version>1.26.3</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

二、添加配置文件application.properties

server.port=8989

# fastDFS 配置
fdfs.so-timeout=1501
fdfs.connect-timeout=601
fdfs.thumb-image.width=150
fdfs.thumb-image.height=150
fdfs.web-server-url=192.168.xxx.x:xxxxx/     //这个会追加在返回地址的前面 ip+nginx的端口
fdfs.tracker-list[0]=192.168.xxx.x:22122

三、FastDFS工具类

import com.github.tobato.fastdfs.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;

@Slf4j
@Component
public class FastDFSUtils {
    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private FdfsWebServer fdfsWebServer;

    /**
     * 上传文件
     *
     * @param file 文件对象
     * @return 文件访问地址
     * @throws IOException
     */
    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return getResAccessUrl(storePath);
    }

    /**
     * 上传文件
     *
     * @param file 文件对象
     * @return 文件访问地址
     * @throws IOException
     */
    public String uploadFile(File file) throws IOException {
        FileInputStream inputStream = new FileInputStream(file);
        StorePath storePath = storageClient.uploadFile(inputStream, file.length(), FilenameUtils.getExtension(file.getName()), null);
        return getResAccessUrl(storePath);
    }

    /**
     * 将一段字符串生成一个文件上传
     *
     * @param content       文件内容
     * @param fileExtension
     * @return
     */
    public String uploadFile(String content, String fileExtension) {
        byte[] buff = content.getBytes(Charset.forName("UTF-8"));
        ByteArrayInputStream stream = new ByteArrayInputStream(buff);
        StorePath storePath = storageClient.uploadFile(stream, buff.length, fileExtension, null);
        return getResAccessUrl(storePath);
    }

    // 封装图片完整URL地址
    private String getResAccessUrl(StorePath storePath) {
        String fileUrl = fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
        return fileUrl;
    }

    /**
     * 下载文件
     *
     * @param fileUrl 文件url
     * @return
     */
    public byte[] download(String fileUrl) {
        String group = fileUrl.substring(0, fileUrl.indexOf("/"));
        String path = fileUrl.substring(fileUrl.indexOf("/") + 1);
        byte[] bytes = storageClient.downloadFile(group, path, new DownloadByteArray());
        return bytes;
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件访问地址
     * @return
     */
    public void deleteFile(String fileUrl) {
        if (StringUtils.isEmpty(fileUrl)) {
            return;
        }
        try {
            StorePath storePath = StorePath.praseFromUrl(fileUrl);
            storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
        } catch (FdfsUnsupportStorePathException e) {
            log.warn(e.getMessage());
        }
    }

}

加载 FastDFS 配置类

import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;

@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ComponetImport {
}

controller 类

@RestController
@RequestMapping("/opinion")
public class FastDFSController {
	
	@Autowired
	private FastDFSClient fdfsClient;

	/**
	 * 文件上传
	 * @param file
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/upload1")
	public Map<String,Object> upload(@RequestParam("pic")MultipartFile file) throws Exception{
		
		String url = fdfsClient.uploadFile(file);
		
		Map<String,Object> result = new HashMap<>();
		result.put("code", 200);
		result.put("msg", "上传成功");
		result.put("url", url);
		
		return result;
	}
	
}

四、用postman测试一下

 这里返回值的形式和controller里的样式不一样,是因为我的实际代码,返回值不是map,是专门封装了一个响应前端数据的类。但是这里你直接复制这个代码操作不会有任何影响。

参考文章:https://blog.csdn.net/lgw96000/article/details/83268724

总结:

到这里,springboot简单整合FastDFS已经基本完成,但是还有一些问题,比如你本地没法连接远程服务器tracker 192.168.xxx.x:22122时,就算你映射192.168.xxx.x:22122外网地址,但是由于fastdfs_client_java客户端是先访问tracker,tracker返回可用的storage的ip,但是这个ip和端口是内网的storage的,这样对调试会产生很大的不便。暂时对于这种特殊的情况,并没有很好的解决办法,只能把应用扔到内网服务器去调试。

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有76位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言。

发布了98 篇原创文章 · 获赞 917 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/jdk_wangtaida/article/details/89382401