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

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

fastdfs安装

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

image.png

image.png

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

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

在服务提供方内,添加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<PictureResult> result = new Result(0, "上传成功", pictureResult);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Result(1, "上传失败");
    }

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

测试

image.png

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,958评论 19 139
  • FastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理,功能包括:文件存储、文件同步、文件...
    欢醉阅读 4,064评论 3 12
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,404评论 25 708
  • 0913(D59)亲爱的金禄:感恩无非,让你准时和自己对话,记录一天所思,赞赏自己。 1坐在健身房角落,台风来临前...
    胡金禄阅读 108评论 0 0
  • 1.世界上另一个你 早晨吃过早饭,投放餐具的时候,转身一瞥,一个姑娘看起来好熟悉,齐刘海,微微嘟起的双颊,牛仔裤,...
    野都L阅读 241评论 0 0