- 前言
- 第一部分 基础应用开发
- 第 1 章 Spring Boot 入门
- 第 2 章 在 Spring Boot 中使用数据库
- 第 3 章 Spring Boot 界面设计
- 第 4 章 提高数据库访问性能
- 第 5 章 Spring Boot 安全设计
- 第二部分 分布式应用开发
- 第 6 章 Spring Boot SSO
- 第 7 章 使用分布式文件系统
- 第 8 章 云应用开发
- 第 9 章 构建高性能的服务平台
- 第三部分 核心技术源代码分析
- 第 10 章 Spring Boot 自动配置实现原理
- 第 11 章 Spring Boot 数据访问实现原理
- 第 12 章 微服务核心技术实现原理
- 附录 A 安装 Neo4j
- 附录 B 安装 MongoDB
- 附录 C 安装 Redis
- 附录 D 安装 RabbitMQ
- 结束语
7.5 使用本地文件库
对于已经上传的图片,可以创建一个文件库来管理,这样不但可以重复利用图片,还可以编辑,如果不再需要了,可以执行删除操作。
7.5.1 本地文件库建模
在 Neo4j 数据库中增加一个用来保存图片信息的图片节点,代码清单 7-14 是图片节点 Picture 的实体建模,其中 fileName 用来保存从 FastFDS 返回的文件路径,pathInfo 用来保存完整的文件链接前半部分路径,即代码清单 7-11 中的 pathHead 参数的值。
代码清单 7-14 图片节点实体建模
@NodeEntity public class Picture { @GraphId private Long id; private String pathInfo; private String fileName; private int width; private int height; private String flag; @DateLong private Date create; private Long shopid;…… }
7.5.2 文件保存方法
代码清单 7-15 是一个保存文件的后台线程,使用后台线程来执行保存文件的方法,将会在不影响界面上操作的情况下,从后台中稍稍地执行 savePic 方法。
代码清单 7-15 保存文件的线程
AsyncThreadPool.getInstance().execute(new Runnable() { @Override public void run() { try { savePic(upfile, filename ,shopid); } catch (Exception e) { e.printStackTrace(); } } });
savePic 方法的定义如代码清单 7-16 所示,它调用数据库服务类 PictureService,将文件信息保存到数据库中。其中使用 ImageIO 来读取文件的高度和宽度。
代码清单 7-16 保存文件的方法
@Autowired private PictureService pictureService; private void savePic(MultipartFile multipartFile, String filename, Longshopid) throws Exception{ BufferedImage image = ImageIO.read(multipartFile.getInputStream()); Picture picture = new Picture(); picture.setFileName(filename); picture.setHeight(image.getHeight()); picture.setWidth(image.getWidth()); picture.setPathInfo(pathHead); picture.setCreate(new Date()); picture.setShopid(shopid); pictureService.create(picture); }
数据库服务类 PictureService 的定义如代码清单 7-17 所示,它调用资源库接口 pictureRepository 和分页查询服务类 pagesService,提供增删查改及其分页查询功能。
代码清单 7-17 数据库服务类 PictureService
@Service public class PictureService { @Autowired private PictureRepository pictureRepository; @Autowired private PagesService<Picture> pagesService; public Picture findById(Long id) { return pictureRepository.findOne(id); } public Picture create(Picture picture) { return pictureRepository.save(picture); } public Picture update(Picture picture) { return pictureRepository.save(picture); } public void delete(Long id) { Picture picture = pictureRepository.findOne(id); pictureRepository.delete(picture); } public Picture findByName(String name){ return pictureRepository.findByFileName(name); } public void delete(Picture picture){ pictureRepository.delete(picture); } public Iterable<Picture> findAll(){ return pictureRepository.findAll(); } public Page<Picture> findPage(PictureQo pictureQo){ Pageable pageable = new PageRequest(pictureQo.getPage(), pictureQo.getSize(), new Sort(Sort.Direction.ASC, "id")); Filters filters = new Filters(); if (!StringUtils.isEmpty(pictureQo.getFileName())) { Filter filter = new Filter("name", pictureQo.getFileName()); filters.add(filter); } if (!StringUtils.isEmpty(pictureQo.getShopid())) { Filter filter = new Filter("shopid", pictureQo.getShopid()); filter.setComparisonOperator(ComparisonOperator.EQUALS); filter.setBooleanOperator(BooleanOperator.AND); filters.add(filter); } return pagesService.findAll(Picture.class, pageable, filters); } }
7.5.3 文件库管理
保存图片信息之后,可以取出已经上传的图片列表,按需选择可用的图片,不需要的图片,也可以删除。需要注意的是,删除图片时,不但要删除文件库 Picture 的图片信息,而且要删除 FastFDS 服务器上的文件。
代码清单 7-18 是取图片列表的控制器设计,它将返回一个 Page 对象,其中包含 Picture 列表,列表将由视图处理并按页显示出来以供用户选择使用。
代码清单 7-18 取图片列表控制器设计
@RequestMapping(value = "/listPic", method = RequestMethod.POST) @ResponseBody public Page<Picture> listPic(PictureQo pictureQo) throws IOException{ Long shopid = 1L; pictureQo.setShopid(shopid); return pictureService.findPage(pictureQo); }
代码清单 7-19 是取图片列表的视图设计部分的 js 编码,它从上面定义的控制器中取得列表后,按每行 4 张图片、每页 2 行的格式来显示列表。
代码清单 7-19 取图片列表视图设计部分的 js 编码
// 分页数据 function getDataHtml(pageNo,pagesize) { $.ajax({ url: "/pic/listPic", dataType: "json", type: "POST", cache: false, data: {page: pageNo-1,size: pagesize || 8}, success: function (data) { var $list = $('#upload-list').empty(); $.each(data.content, function (i, v) { var html = ""; html += '<div class="upload-item">'+ '<div class="img"><img src="'+ v.pathInfo + v.fileName + '" /></div>'+ '<p>'+v.width+'x'+ v.height+'</p>'+ '<div class="selected"></div>'+ '</div>'; $list.append($(html)); }) page.photos.setPosition(); document.getElementById('pagebar').innerHTML = PageBarNumList.get PageBar(data.number+1, data.totalPages, 3, 'getDataHtml',pagesize || 8,true); }, error: function (e) {} }); }
最后完成的效果如图 7-4 所示。这样,当在图片中单击选择一张图片后,再单击确定按钮即可使用这张图片,单击删除按钮将删除这张图片。
图 7-4 本地文件库管理效果图
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论