基于fastdfs实现文件上传微服务

在《Spring Cloud实现文件上传》一文中,我利用Spring Cloud实现了文件上传的微服务。让我们再想想这种情况,如果我想上传文件后其他应用能够访问到该文件,那我们必须将该文件上传至某个ftp或web服务器路径目录下;如果多个应用都要调用文件上传服务,必须对文件的上传目录进行结构组织;如若要方便用户直接查找文件的话,可能还要对文件按规则统一命名,太多问题扑面而来。
上述问题究其根本,是我们需要一个图片服务器。它能够进行组织存储、文件命名、文档容灾等等,而fastdfs就是个很好的图片服务器脚手架。

fastdfs安装

参考:FastDFS 安装和配置
腾讯云服务器 安装fastdfs文件服务器
利用fastdfs自带的client测试图片上传

基于fastdfs实现文件上传微服务_第1张图片
image.png

基于fastdfs实现文件上传微服务_第2张图片
image.png

基于fastdfs实现文件上传微服务_第3张图片
image.png

这里要特别注意一个配置,忽略它也许你访问图片会报
Nginx 400 Bad Request
在fastdfs-nginx-module模块mod_fastdfs.conf配置文件中有如下一个配置

# if the url / uri including the group name
# set to false when uri like /M00/00/00/xxx
# set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
# default value is false
url_have_group_name = true

可以看到,如果我们配置了group_name,必须设置url_have_group_name为true

总体思路

利用fastdfs client java操作fastdfs,将返回的url持久化到数据库中,并告知服务调用方。
如何利用java操作fastdfs呢,非常幸运在github上作者:happyfish100开源了fastdfs-client-java,将项目clone下来,进行打包,注册到本地库中。
在maven中添加fastdfs-client-java


    org.csource
    fastdfs-client-java
    1.27-SNAPSHOT

在服务提供方内,添加uploadpicturetoFastDFS接口,向外提供服务。这里利用泛型来包装结果致Result类的data属性中,采用这种方法的好处是,我们无须针对各种返回结果定义对应的数据结构。
具体实现:

    @Override
    public Result uploadtofastdfs(String filename, byte[] data) {
        PictureResult pictureResult = new PictureResult();
        try {
            FastDFSClient client = new FastDFSClient("classpath:fdfs_client.conf");
            String extName = filename.substring(filename.lastIndexOf(".") + 1);
            String url = client.uploadFile(data, extName);
            pictureResult.setUrlDB(url);
            pictureResult.setUrl(imageServerUrl + url);
            System.out.println("-------文件上传成功!-------------");
            System.out.println(pictureResult.getUrl());
            Result result = new Result(0, "上传成功", pictureResult);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Result(1, "上传失败");
    }

因图片服务器的ip地址会改变,所以我们在数据库中只持久化fieldID值,为了方便服务方调用,同时向外提供拼接好的图片访问地址。

测试

基于fastdfs实现文件上传微服务_第4张图片
image.png

image.png

你可能感兴趣的:(基于fastdfs实现文件上传微服务)