赞
踩
在《Spring Cloud实现文件上传》一文中,我利用Spring Cloud实现了文件上传的微服务。让我们再想想这种情况,如果我想上传文件后其他应用能够访问到该文件,那我们必须将该文件上传至某个ftp或web服务器路径目录下;如果多个应用都要调用文件上传服务,必须对文件的上传目录进行结构组织;如若要方便用户直接查找文件的话,可能还要对文件按规则统一命名,太多问题扑面而来。
上述问题究其根本,是我们需要一个图片服务器。它能够进行组织存储、文件命名、文档容灾等等,而fastdfs就是个很好的图片服务器脚手架。
fastdfs安装
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
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值,为了方便服务方调用,同时向外提供拼接好的图片访问地址。
测试
image.png
image.png
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。