上传图片开发

1.1.1需求分析

在很多系统都有上传图片/上传文件的需求,比如:上传课程图片、上传课程资料、上传用户头像等,为了提供系 统的可重用性专门设立文件系统服务承担图片/文件的管理,文件系统服务实现对文件的上传、删除、查询等功能 进行管理。

各各子系统不再开发上传文件的请求,各各子系统通过文件系统服务进行文件的上传、删除等操作。文件系统服务 最终会将文件存储到fastDSF文件系统中。

下图是各各子系统与文件系统服务之间的关系:

下图是课程管理中上传图片处理流程:

执行流程如下:

1、管理员进入教学管理前端,点击上传图片

2、图片上传至文件系统服务,文件系统请求fastDFS上传文件

3、文件系统将文件入库,存储到文件系统服务数据库中。

4、文件系统服务向前端返回文件上传结果,如果成功则包括文件的Url路径。

5、课程管理前端请求课程管理进行保存课程图片信息到课程数据库。

6、课程管理服务将课程图片保存在课程数据库。

1.1.2创建文件系统服务工程

导入xc-service-base-filesystem.zip工程。

1)工程目录结构

pom.xml

<?xml version="1.0" encoding="UTF‐8"?>xc‐framework‐parentcom.xuecheng1.0‐SNAPSHOT../xc‐framework‐parent/pom.xml4.0.0xc‐service‐base‐filesystemcom.xuechengxc‐service‐api1.0‐SNAPSHOTcom.xuechengxc‐framework‐model1.0‐SNAPSHOTcom.xuechengxc‐framework‐common1.0‐SNAPSHOTorg.springframework.bootspring‐boot‐starter‐webnet.oschina.zcx7878fastdfs‐client‐javaorg.springframework.bootspring‐boot‐starter‐testtestorg.apache.commonscommons‐ioorg.springframework.bootspring‐boot‐starter‐data‐mongodb

2)配置文件

原测试程序中fastdfs-client.properties的配置信息统一放在application.yml application.yml

server:port: 22100 spring:application:name: xc‐service‐base‐filesystem #mongo配置data:mongodb:database: xc_fsuri: mongodb://root:123@127.0.0.1:27017 #SpringMVC上传文件配置servlet: multipart:#默认支持文件上传.enabled: true#支持文件写入磁盘.file‐size‐threshold: 0 # 上传文件的临时目录location:# 最大支持文件大小max‐file‐size: 1MB # 最大支持请求大小max‐request‐size: 30MB xuecheng:fastdfs: connect_timeout_in_seconds: 5network_timeout_in_seconds: 30 charset: UTF‐8tracker_servers: 192.168.101.64:22122

1.1.3API接口

1.1.3.1模型类

系统的文件信息(图片、文档等小文件的信息)在mongodb中存储,下边是文件信息的模型类。

1)模型如下:

@Data@ToString@Document(collection = "filesystem") public class FileSystem {@Idprivate String fileId;//文件请求路径private String filePath;//文件大小private long fileSize;//文件名称private String fileName;//文件类型private String fileType;//图片宽度private int fileWidth;//图片高度private int fileHeight;//用户id,用于授权暂时不用private String userId;//业务keyprivate String businesskey;//业务标签private String filetag;//文件元信息private Map metadata;

说明:

fileId:fastDFS返回的文件ID。filePath:请求fastDFS浏览文件URL。

filetag:文件标签,由于文件系统服务是公共服务,文件系统服务会为使用文件系统服务的子系统分配文件标签, 用于标识此文件来自哪个系统。

businesskey:文件系统服务为其它子系统提供的一个业务标识字段,各子系统根据自己的需求去使用,比如:课 程管理会在此字段中存储课程id用于标识该图片属于哪个课程。

metadata:文件相关的元信息。

2)collection

在mongodb创建数据库xc_fs(文件系统数据库),并创建集合 filesystem。

1.1.3.2Api接口

在api工程下创建com.xuecheng.api.filesystem包,

public interface FileSystemControllerApi {/***上传文件*@param multipartFile 文 件*@param filetag 文件标签*@param businesskey 业务key*@param metedata 元信息,json格式*@return*/public UploadFileResult upload(MultipartFile multipartFile, String filetag,String businesskey, String metadata);}

1.1.2.3Dao

将文件信息存入数据库,主要存储文件系统中的文件路径。

public interface FileSystemRepository extends MongoRepository {}

1.1.2.4Service

@Servicepublic class FileSystemService {private static final Logger LOGGER = LoggerFactory.getLogger(FileSystemService.class); @Value("${xuecheng.fastdfs.tracker_servers}")String tracker_servers; @Value("${xuecheng.fastdfs.connect_timeout_in_seconds}") int connect_timeout_in_seconds; @Value("${xuecheng.fastdfs.network_timeout_in_seconds}") int network_timeout_in_seconds; @Value("${xuecheng.fastdfs.charset}")String charset;@AutowiredFileSystemRepository fileSystemRepository;//加载fdfs的配置private void initFdfsConfig(){ try {ClientGlobal.initByTrackers(tracker_servers); ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds); ClientGlobal.setG_network_timeout(network_timeout_in_seconds); ClientGlobal.setG_charset(charset);} catch (Exception e) { e.printStackTrace();//初始化文件系统出错ExceptionCast.cast(FileSystemCode.FS_INITFDFSERROR);}}//上传文件public UploadFileResult upload(MultipartFile file,String filetag, String businesskey, String metadata){if(file == null){ ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);}//上传文件到fdfsString fileId = fdfs_upload(file);//创建文件信息对象FileSystem fileSystem = new FileSystem();// 文 件 id fileSystem.setFileId(fileId);//文件在文件系统中的路径fileSystem.setFilePath(fileId);//业务标识fileSystem.setBusinesskey(businesskey);//标签fileSystem.setFiletag(filetag);//元数据if(StringUtils.isNotEmpty(metadata)){try {Map map = JSON.parseObject(metadata, Map.class); fileSystem.setMetadata(map);} catch (Exception e) { e.printStackTrace();}}//名称fileSystem.setFileName(file.getOriginalFilename());//大小fileSystem.setFileSize(file.getSize());//文件类型fileSystem.setFileType(file.getContentType()); fileSystemRepository.save(fileSystem);return new UploadFileResult(CommonCode.SUCCESS,fileSystem);}//上传文件到fdfs,返回文件idpublic String fdfs_upload(MultipartFile file) { try {//加载fdfs的配置initFdfsConfig();//创建tracker clientTrackerClient trackerClient = new TrackerClient();//获取trackerServerTrackerServer trackerServer = trackerClient.getConnection();//获取storageStorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);//创建storage clientStorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);//上传文件//文件字节byte[] bytes = file.getBytes();//文件原始名称String originalFilename = file.getOriginalFilename();//文件扩展名String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);//文件idString file1 = storageClient1.upload_file1(bytes, extName, null);return file1;} catch (Exception e) { e.printStackTrace();}return null;}}

1.1.2.5Controller

@RestController @RequestMapping("/filesystem")public class FileSystemController implements FileSystemControllerApi { @AutowiredFileSystemService fileSystemService;@Override @PostMapping("/upload")public UploadFileResult upload(@RequestParam("file") MultipartFile file,@RequestParam(value = "filetag

存入json文件_学成在线第8-2天讲义-课程图片管理 分布式文件系统 上传图片开发...相关推荐

  1. 黑马java学成在线项目 第1天 讲义-项目概述 CMS接口开发 三

    4 CMS服务端工程搭建 4.1 开发工具配置 服务端工程使用IntellijIDEA开发. 1.创建工程代码目录 XcEduCode(本教程创建XcEduCode01目录),并且IDEA打开. 2. ...

  2. 2017黑加传智java_传智黑马 Java在职加薪课 学成在线

    传智黑马 Java在职加薪课 学成在线 |____[传智播客]学成在线 |____day20 Devops 项目总结 |____day19 分布式事务 |____day18 用户授权 |____day ...

  3. 学成在线--0.项目概述

    文章目录 0.前言 1.功能架构 2.技术架构 3.技术栈 4.开发步骤 0.前言 当前市场的在线教育模式多种多样,包括:B2C.C2C.B2B2C等业务模式,学成在线采用B2B2C业务模式,即向 企 ...

  4. HTML+CSS实战——学成在线项目(含源码、素材、psd文件)

    文章目录 准备工作 版心和清除默认样式 header布局 logo和nav布局 搜索--布局和文本框 用户区域 banner布局 精品推荐 版权区域 项目源码--点击下载 准备工作 版心和清除默认样式 ...

  5. 学成在线--媒资管理模块

    完整版请移步至我的个人博客查看:https://cyborg2077.github.io/ 学成在线–项目环境搭建 学成在线–内容管理模块 学成在线–媒资管理模块 学成在线–课程发布模块 学成在线–认 ...

  6. 学成在线--认证授权模块

    完整版请移步至我的个人博客查看:https://cyborg2077.github.io/ 学成在线–项目环境搭建 学成在线–内容管理模块 学成在线–媒资管理模块 学成在线–课程发布模块 学成在线–认 ...

  7. 学成在线--1.CMS接口开发

    文章目录 0.定义CMS 1.CMS页面管理 2.需求分析 3.模型类介绍 4.定义请求及响应类型 5.定义接口 6.创建CMS工程结构 7.Dao 1)创建Dao,继承MongoRepository ...

  8. 学成在线-第16天-讲义- Spring Security Oauth2 JWT RSA加解密

    学成在线-第16天-讲义- Spring Security Oauth2 JWT 1 用户认证需求分析 1.1 用户认证与授权 ​ 截至目前,项目已经完成了在线学习功能,用户通过在线学习页面点播视频进 ...

  9. 学成在线-第13天-讲义-在线学习 HLS

    1在线学习需求分析 1.1需求描述 学成在线作为在线教育网站,提供多种学习形式,包括:录播.直播.图文.社群等,学生登录进入学习中心即可 在线学习,本章节将开发录播课程的在线学习功能,需求如下: 1. ...

最新文章

  1. SmartDoc(YUIDoc) 注释编写
  2. foreach遍历----for(object o: list)
  3. Silverlight 打印
  4. Spark之scala学习(基础篇)待更新
  5. (68)信号发生器DDS协议(第14天)
  6. C++并发编程之std::future
  7. C++静态成员总结(转)
  8. mysql 、慢查询、到底如何玩
  9. 三菱四节传送带控制梯形图_四节传送带控制
  10. 商汤的AI伴游小精灵(找最多子树)
  11. 公有云平台专题《中移云平台,NB-IoT模组对接中移OneNET平台》
  12. 为什么说美团的天花板是美团自己?
  13. IM3、IIP3、OIP3、G、P1dB指标之间的关系
  14. EAS BOS:BOS工具导入解决方案失败常见问题分析
  15. 牛顿下降法和梯度下降法(最速下降法)的速度的比较
  16. 能上Q不能上网解决方案
  17. 记一次面试的尴尬,说说作为数据库工程师,学好英语的重要性
  18. labelmx条码打印软件3.7
  19. ubuntu下安装UltraEdit
  20. 常用QQ还是得绑定手机号,开启QQ手机安全助手。

热门文章

  1. 「雕爷学编程」Arduino动手做(36)——WS2812B 4位彩灯模块
  2. Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件...
  3. JAVA-date(计算时间差)
  4. 调用Interop.zkemkeeper.dll无法使用解决方案
  5. Asp.net MVC 示例项目Suteki.Shop分析之---Model和Service
  6. jquery框架分析-构造jquery对象初步
  7. Android RecyclerView (十)组件化封装
  8. 错误的模糊应用(类继承问题)
  9. Django:新手入门学习资料汇总
  10. 三、面向对象——9-初始化块