5. 文件服务开发
5.1 环境搭建
5.1.1 数据库环境搭建
第一步:创建pd_files数据库
create database pd_files character set utf8mb4;
第二步:在pd_files数据库中创建pd_attachment和pd_file数据表
CREATE TABLE `pd_attachment` (
`id` bigint(20) NOT NULL COMMENT 'ID',
`biz_id` varchar(64) DEFAULT NULL COMMENT '业务ID',
`biz_type` varchar(255) DEFAULT NULL COMMENT '业务类型\n#AttachmentType',
`data_type` varchar(255) DEFAULT 'IMAGE' COMMENT '数据类型\n#DataType{DIR:目录;IMAGE:图片;VIDEO:视频;AUDIO:音频;DOC:文档;OTHER:其他}',
`submitted_file_name` varchar(255) DEFAULT '' COMMENT '原始文件名',
`group_` varchar(255) DEFAULT '' COMMENT 'FastDFS返回的组\n用于FastDFS',
`path` varchar(255) DEFAULT '' COMMENT 'FastDFS的远程文件名\n用于FastDFS',
`relative_path` varchar(255) DEFAULT '' COMMENT '文件相对路径',
`url` varchar(255) DEFAULT '' COMMENT '文件访问链接\n需要通过nginx配置路由,才能访问',
`file_md5` varchar(255) DEFAULT NULL COMMENT '文件md5值',
`context_type` varchar(255) DEFAULT '' COMMENT '文件上传类型\n取上传文件的值',
`filename` varchar(255) DEFAULT '' COMMENT '唯一文件名',
`ext` varchar(64) DEFAULT '' COMMENT '后缀\n (没有.)',
`size` bigint(20) DEFAULT '0' COMMENT '大小',
`org_id` bigint(20) DEFAULT NULL COMMENT '组织ID\n#c_core_org',
`icon` varchar(64) DEFAULT '' COMMENT '图标',
`create_month` varchar(10) DEFAULT NULL COMMENT '创建年月\n格式:yyyy-MM 用于统计',
`create_week` varchar(10) DEFAULT NULL COMMENT '创建时处于当年的第几周\nyyyy-ww 用于统计',
`create_day` varchar(12) DEFAULT NULL COMMENT '创建年月日\n格式: yyyy-MM-dd 用于统计',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_user` bigint(11) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '最后修改时间',
`update_user` bigint(11) DEFAULT NULL COMMENT '最后修改人',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='附件';
CREATE TABLE `pd_file` (
`id` bigint(20) NOT NULL COMMENT '主键',
`data_type` varchar(255) DEFAULT 'IMAGE' COMMENT '数据类型\n#DataType{DIR:目录;IMAGE:图片;VIDEO:视频;AUDIO:音频;DOC:文档;OTHER:其他}',
`submitted_file_name` varchar(255) DEFAULT '' COMMENT '原始文件名',
`tree_path` varchar(255) DEFAULT ',' COMMENT '父目录层级关系',
`grade` int(11) DEFAULT '1' COMMENT '层级等级\n从1开始计算',
`is_delete` bit(1) DEFAULT b'0' COMMENT '是否删除\n#BooleanStatus{TRUE:1,已删除;FALSE:0,未删除}',
`folder_id` bigint(20) DEFAULT '0' COMMENT '父文件夹ID',
`url` varchar(1000) DEFAULT '' COMMENT '文件访问链接\n需要通过nginx配置路由,才能访问',
`size` bigint(20) DEFAULT '0' COMMENT '文件大小\n单位字节',
`folder_name` varchar(255) DEFAULT '' COMMENT '父文件夹名称',
`group_` varchar(255) DEFAULT '' COMMENT 'FastDFS组\n用于FastDFS',
`path` varchar(255) DEFAULT '' COMMENT 'FastDFS远程文件名\n用于FastDFS',
`relative_path` varchar(255) DEFAULT '' COMMENT '文件的相对路径 ',
`file_md5` varchar(255) DEFAULT '' COMMENT 'md5值',
`context_type` varchar(255) DEFAULT '' COMMENT '文件类型\n取上传文件的值',
`filename` varchar(255) DEFAULT '' COMMENT '唯一文件名',
`ext` varchar(64) DEFAULT '' COMMENT '文件名后缀 \n(没有.)',
`icon` varchar(64) DEFAULT '' COMMENT '文件图标\n用于云盘显示',
`create_month` varchar(10) DEFAULT NULL COMMENT '创建时年月\n格式:yyyy-MM 用于统计',
`create_week` varchar(10) DEFAULT NULL COMMENT '创建时年周\nyyyy-ww 用于统计',
`create_day` varchar(12) DEFAULT NULL COMMENT '创建时年月日\n格式: yyyy-MM-dd 用于统计',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_user` bigint(20) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '最后修改时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '最后修改人',
`source` varchar(10) DEFAULT 'inner' COMMENT '文件来源:inner, outer',
PRIMARY KEY (`id`) USING BTREE,
FULLTEXT KEY `FU_TREE_PATH` (`tree_path`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='文件表';
注:SQL脚本位置为 文件服务/资料/数据库/pd_files.sql
前面已经提到,本系统的文件服务提供两种类型的服务:
1、面对应用系统的通用附件服务
提供统一的上传接口,屏蔽底层的存储方案(本地存储、FastDFS、阿里云存储、七牛云存储等),可独立运行服务。上传的文件相关信息保存在pd_attachment表中。
2、面对用户的网盘服务
提供统一的上传接口,屏蔽底层的存储方案,有文件夹和文件的概念,支持大文件分片上传、断点续传。上传的文件相关信息保存在pd_file表中。
pd_attachment表为附件表,具体表结构如下:
pd_file表为文件/文件夹信息表,具体表结构如下:
5.1.2 Nacos环境搭建
第一步:安装Nacos并进行配置(略)
第二步:在Nacos中创建命名空间fileService(名字随便起,只要和程序里配置的一样就可以)
第三步:在Nacos中将配置文件导入到file-server命名空间
注:yml配置文件位置为 文件服务/资料/Nacos/nacos_config_export_2020-04-30 11_47_56.zip
5.1.3 Nginx环境搭建
当文件存储策略为本地存储或者FastDFS存储时,需要使用Nginx服务来对外提供文件的下载和查看等功能。
第一步:安装Nginx(略)
第二步:配置Nginx_HOME/conf/nginx.conf
注:可参照 文件服务/资料/Nginx/nginx.conf
进行配置
5.1.4 maven工程环境搭建
说明:本项目的开发并不是从零开始搭建开发环境,而是在一个名为品达通用权限系统的基础上进行文件服务的开发。品达通用权限系统是传智播客提供的一个开发平台(脚手架),其中提供了一系列的基础组件并且已经实现了权限管理、认证、鉴权、JWT解析等功能。用户可以在此平台基础上开发自己的业务功能。
品达通用权限系统位置: 文件服务/资料/初始工程(脚手架)/pinda-authority
具体搭建过程:
第一步:导入品达通用权限系统到IDEA并修改pd-apps模块中的pom.xml文件
<profile>
<id>devid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<pom.profile.name>devpom.profile.name>
<pom.nacos.ip>127.0.0.1pom.nacos.ip>
<pom.nacos.port>8848pom.nacos.port>
<pom.nacos.namespace>
53c655b3-babd-4402-82f1-33b7e4c90111
pom.nacos.namespace>
properties>
profile>
第二步:在品达通用权限系统平台基础之上创建文件服务对应的maven工程pd-file
第三步:在pd-file下创建pd-file-entity子模块并配置pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pd-fileartifactId>
<groupId>com.itheimagroupId>
<version>1.0.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>pd-file-entityartifactId>
<description>文件服务实体模块description>
<dependencies>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-commonartifactId>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-coreartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plusartifactId>
dependency>
dependencies>
project>
第四步:将文件服务相关的实体类、DTO、domain等导入pd-file-entity中
注:文件服务相关实体类位置 文件服务/资料/文件服务相关实体类
第五步:在pd-file下创建pd-file-server子模块并配置pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pd-fileartifactId>
<groupId>com.itheimagroupId>
<version>1.0.0version>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>pd-file-serverartifactId>
<description>文件服务启动模块description>
<dependencies>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-auth-apiartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
<exclusions>
<exclusion>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-logartifactId>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-swagger2artifactId>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-validatorartifactId>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-xssartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<exclusions>
<exclusion>
<artifactId>fastjsonartifactId>
<groupId>com.alibabagroupId>
exclusion>
<exclusion>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
<exclusions>
<exclusion>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.ow2.asmgroupId>
<artifactId>asmartifactId>
<version>${asm.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-websocketartifactId>
exclusion>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-undertowartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-aopartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jsonartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-file-entityartifactId>
<version>1.0.0version>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-databasesartifactId>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>pd-tools-dozerartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-contextartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
dependency>
<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
dependency>
<dependency>
<groupId>com.qiniugroupId>
<artifactId>qiniu-java-sdkartifactId>
dependency>
<dependency>
<groupId>com.github.tobatogroupId>
<artifactId>fastdfs-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
<scope>compilescope>
dependency>
dependencies>
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
第六步:导入配置文件到pd-file-server中
注:文件服务相关配置文件位置: 文件服务/资料/文件服务相关配置文件
第七步:在pd-file-server中创建启动类
package com.itheima.pinda;
import com.itheima.pinda.validator.config.EnableFormValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.net.InetAddress;
import java.net.UnknownHostException;
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients(value = {
"com.itheima.pinda",
})
@EnableTransactionManagement
@Slf4j
@EnableFormValidator
public class FileServerApplication {
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext application = SpringApplication.run(FileServerApplication.class, args);
Environment env = application.getEnvironment();
log.info("\n----------------------------------------------------------\n\t" +
"应用 '{}' 运行成功! 访问连接:\n\t" +
"Swagger文档: \t\thttp://{}:{}/doc.html\n\t" +
"数据库监控: \t\thttp://{}:{}/druid\n" +
"----------------------------------------------------------",
env.getProperty("spring.application.name"),
InetAddress.getLocalHost().getHostAddress(),
env.getProperty("server.port"),
"127.0.0.1",
env.getProperty("server.port"));
}
}
第八步:将配置类导入pd-file-server中
注:文件服务相关配置类位置: 文件服务/资料/文件服务配置类
第九步:在pd-file-server中导入工具类
注:文件服务相关工具类位置: 文件服务/资料/文件服务工具类
第十步:在pd-file-server中导入配置属性类
注:文件服务相关配置属性类位置: 文件服务/资料/文件服务配置属性类
第十一步:在pd-file-server中导入Mapper接口
注:文件服务相关Mapper接口位置: 文件服务/资料/文件服务相关Mapper接口