0%

filecenter

1. 杂记

SSP: self-service platform
IDR: 标识解析展现 ID Read
API:

FileCenter

========================

handle是通信协议

公共:上传->重新命名uuid 路径固定
加密:无法通过url直接访问,没有密码只是乱码
自定义:admin可以改路径 年月日uuid.jpg
临时:每天12点清空

有时,上传时,先去临时,再去公告/加密
选择文件后,已经去服务器了

//
uploadFile
//按钮:选择加密或不加密 传到不同的区域 默认
全部传到公共区域,不考虑上传到自定义页面

1.控制上传文件的类型 图片/视频/文档
2.调filecenter时 需要先申请令牌?

文件中心是一个服务 下属多个服务器

//
iic-table 实现了watch searchParams

2. filecenter

2.1 iic-file-api

api中的功能,调用web来实现

2.1.1 proxy

2.1.1.1 LllFileV2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
public class LllFileV2 {
public final static int TYPE_COMMON = 1;
public final static int TYPE_SECRET = 2;
public final static int TYPE_TEMP = 3;

private String fileId;
private String userId;
private Integer type; //COMMON,SECRET,TEMP
private Date createTime;
private String fileName; //文件名(包含后缀)
private String savePath; //文件保存路径 (不包含文件名)
private String fileSuffix; //文件后缀
private String oldName; //文件原名
private String url; //完整的URL访问地址(包含Https)
private String secKey; //SM4密钥
private String hash; //文件的Hash值
private String appName; //系统账号名称,如:IIC
private byte[] cont;

public static LllFileV2 create(JsonObject data) throws Exception {
LllFileV2 file = new LllFileV2();

String _fileId = JsonUtil.getString(data, "fileId");
String _userId = JsonUtil.getString(data, "userId");
String _type = JsonUtil.getString(data, "type");
String _createTime = JsonUtil.getString(data, "createTime");
Date _time = null;
if(!ToolUtil.isNull(_createTime)) {
_time = new Date(Long.valueOf(_createTime));
}
String _fileName = JsonUtil.getString(data, "fileName");
String _savePath = JsonUtil.getString(data, "savePath");
String _fileSuffix = JsonUtil.getString(data, "fileSuffix");
String _oldName = JsonUtil.getString(data, "oldName");
String _url = JsonUtil.getString(data, "url");
String _secKey = JsonUtil.getString(data, "secKey");
String _hash = JsonUtil.getString(data, "hash");
String _appName = JsonUtil.getString(data, "appName");
String _cont64 = JsonUtil.getString(data, "cont");
byte[] _cont = null;
if(!ToolUtil.isNull(_cont64)) {
_cont = Base64Util.decode(_cont64);
}

file.setFileId(_fileId);
file.setUserId(_userId);
file.setType(Integer.valueOf(_type));
file.setCreateTime(_time);
file.setFileName(_fileName);
file.setSavePath(_savePath);
file.setFileSuffix(_fileSuffix);
file.setOldName(_oldName);
file.setUrl(_url);
file.setSecKey(_secKey);
file.setHash(_hash);
file.setAppName(_appName);
file.setCont(_cont);

return file;
}

public String fetchBase64Cont() {
try {
return Base64Util.encode(cont);
}catch(Exception ex) {}
return "";
}

public String fetchContToStr(){
try {
return new String(cont, Charset.forName("UTF-8"));
} catch (Exception ex){
return "";
}
}

public String getFileId() {
return fileId;
}
public void setFileId(String fileId) {
this.fileId = fileId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getFileSuffix() {
return fileSuffix;
}
public void setFileSuffix(String fileSuffix) {
this.fileSuffix = fileSuffix;
}
public String getOldName() {
return oldName;
}
public void setOldName(String oldName) {
this.oldName = oldName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getSecKey() {
return secKey;
}
public void setSecKey(String secKey) {
this.secKey = secKey;
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public byte[] getCont() {
return cont;
}
public void setCont(byte[] cont) {
this.cont = cont;
}
}

2.1.1.2 FileV2Proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
public class FileV2Proxy {
/**
* @description:申请文件中心token
* @date 11:13 2022/4/13
* @return java.lang.String
*/
public static String getToken() throws Exception {
String authId = SpringUtil.getEvnProperty("file.authId");
final String url = getInSideUrlRoot() + "/api/v2/token?authId=" + authId;
String res = HttpUtil2.sendGet(url);
JsonResult json = JSON.parseObject(res, JsonResult.class);
if ( !json.getSuccess() ) throw new Exception( String.format("token申请失败:%s", res) );
return String.valueOf( json.getData() );
}
/**
* 读取普通文件
* @param fileId
* @return
* @throws Exception
*/
public static byte[] readFile(String fileId) throws Exception{
String url = getOutSideUrlRoot() + "/api/v2/ext/" + fileId;

byte[] file = visitUrl(url);
return file;
}
/**
* 读取加密文件
* @param fileId
* @param key
* @return
* @throws Exception
*/
public static byte[] readFile(String fileId, String key) throws Exception{
String url = new StringBuilder( getOutSideUrlRoot() )
.append("/api/v2/ext/")
.append(fileId)
.append("?key=")
.append(key).toString();

byte[] file = visitUrl(url);
return file;
}
/**
* 上传文件
* @param fileInfo 上传文件信息对象
* @param cont 文件内容
* @return
*/
public static LllFileV2 uploadFile(ULFileInfoVo fileInfo, byte[] cont) throws Exception {
if (ToolUtil.isNull( fileInfo.getToken() )){
String token = getToken();
fileInfo.setToken(token);
}
String url = getOutSideUrlRoot() + "/api/v2/ext/uploadFile";

String base64Cont = Base64Util.encode(cont);
Map<String,String> params = fileInfo.toMap();
params.put("base64Cont", base64Cont);

String res = HttpUtil2.sendPost(url, params);

//解析结果
LllFileV2 file = parseLllFileV2(res);

return file;
}
/**
* 转存临时文件,自动设置authId
* @param fileId 临时文件ID
* @param fileInfo 新的文件信息
* @return
*/
public static LllFileV2 transferTempFile(String fileId, ULFileInfoVo fileInfo) throws Exception {
String url = getInSideUrlRoot() + "/api/v2/transfer-temp-file";
//设置authId
if ( StringUtil.isNull( fileInfo.getToken() ) ){
String authId = SpringUtil.getEvnProperty("file.authId");
fileInfo.setToken(authId);
}
Map<String,String> params = fileInfo.toMap();
params.put("fileId", fileId);

String res = HttpUtil2.sendPost(url, params);

//解析结果
LllFileV2 file = parseLllFileV2(res);

return file;
}

/**
* 读取用户图片列表
* @param authId 授权id
* @param params 查询参数
* @param isCont 是否包含文件内容(true:包含,false:不包含)
* @return
*/
public static List<LllFileV2> listFile(String authId, FileSearchParam params, boolean isCont) throws Exception{
String url = getInSideUrlRoot() + "/api/v2/list";

Map<String,String> _params = params.toMap();
_params.put("authId", authId);

int readContent = isCont ? 1 : 0;
_params.put("cont", String.valueOf(readContent));

String res = HttpUtil2.sendPost(url, _params);
//解析结果
List<LllFileV2> datas = parseLllFileV2List(res);

return datas;
}
public static List<LllFileV2> listFile(String authId, FileSearchParam params) throws Exception{
return listFile(authId, params, false);
}
public static List<LllFileV2> listFile(FileSearchParam params, boolean isCont) throws Exception{
String authId = SpringUtil.getEvnProperty("file.authId");
return listFile(authId, params, isCont);
}

/**
* 查询文件总数
* @param authId 授权id
* @param params 查询参数
* @return
* @throws Exception
*/
public static int countFile(String authId, FileSearchParam params) throws Exception {
String url = getInSideUrlRoot() + "/api/v2/count";

Map<String,String> _params = params.toMap();
_params.put("authId", authId);

String res = HttpUtil2.sendPost(url, _params);

//解析结果
int total = parseLllFileV2Int(res);

return total;
}
public static int countFile(FileSearchParam params) throws Exception {
String authId = SpringUtil.getEvnProperty("file.authId");
return countFile(authId, params);
}

/**
* 读取文件信息
* @param authId 授权id
* @param fileId 文件ID
* @param cont 是否包含文件内容(true:包含,false:不包含)
* @return
* @throws Exception
*/
public static LllFileV2 getFile(String authId, String fileId, boolean cont) throws Exception{
String url = getInSideUrlRoot() + "/api/v2/getFileInfo";

Map<String, String> params = new HashMap<String, String>();
params.put("authId", authId);
params.put("fileId", fileId);

int readContent = cont ? 1 : 0;
params.put("cont", String.valueOf(readContent));

String res = HttpUtil2.sendPost(url, params);

//解析结果
LllFileV2 file = parseLllFileV2(res);

return file;
}
public static LllFileV2 getFile(String authId, String fileId) throws Exception{
return getFile(authId, fileId, false);
}
public static LllFileV2 getFile(String fileId, boolean cont) throws Exception{
String authId = SpringUtil.getEvnProperty("file.authId");
return getFile(authId, fileId, cont);
}

/**
* 删除文件
* @param authId 授权id
* @param fileIds
* @throws Exception
*/
public static void removeFile(String authId, List<String> fileIds) throws Exception{
String url = getInSideUrlRoot() + "/api/v2/removeFile";

String _fileIds = packFileIds(fileIds);

Map<String, String> params = new HashMap<String, String>();
params.put("authId", authId);
params.put("fileIds", _fileIds);

String res = HttpUtil2.sendPost(url, params);

//解析结果
parseResult(res);
}
public static void removeFile(List<String> fileIds) throws Exception{
String authId = SpringUtil.getEvnProperty("file.authId");
removeFile(authId, fileIds);
}
public static void removeFile(String authId, String fileId) throws Exception{
List<String> ls = Arrays.asList(fileId);
removeFile(authId, ls);
}
public static void removeFile(String fileId) throws Exception{
String authId = SpringUtil.getEvnProperty("file.authId");
removeFile(authId, fileId);
}

private static String packFileIds(List<String> fileIds) {
StringJoiner joiner = new StringJoiner(",");
fileIds.forEach(s -> joiner.add(s));

return joiner.toString();
}

private static String getOutSideUrlRoot() {
return SpringUtil.getEvnProperty("file.rootUrl.outside");
}

private static String getInSideUrlRoot() {
return SpringUtil.getEvnProperty("file.rootUrl.inside");
}

private static byte[] visitUrl(String url) throws Exception{
return HttpUtil2.sendGet(url, null, null, content -> content.asBytes());
}

private static LllFileV2 parseLllFileV2(String res) throws Exception{
JsonObject data = parseJsonObject(res);

LllFileV2 file = LllFileV2.create(data);

return file;
}

private static List<LllFileV2> parseLllFileV2List(String res) throws Exception{
JsonArray datas = parseJsonArray(res);

List<LllFileV2> ls = new ArrayList<LllFileV2>();
for(int i=0;i<datas.size();i++) {
JsonObject json = datas.get(i).getAsJsonObject();
LllFileV2 file = LllFileV2.create(json);
ls.add(file);
}

return ls;
}

private static int parseLllFileV2Int(String res) throws Exception{
String data = parseResult(res);

return Integer.valueOf(data);
}

private static void parseResultSucc(JsonObject json) throws Exception{
boolean success = JsonUtil.getBoolean(json, "success");
if(!success) {
JsonObject exJson = JsonUtil.getJsonObject(json, "ex");
String code = JsonUtil.getString(exJson, "code");
String reason = JsonUtil.getString(exJson, "reason");
String msg = "["+code+"]"+reason;
throw new Exception(msg);
}
}

private static String parseResult(String res) throws Exception{
JsonObject json = JsonUtil.parseJsonObject(res);

parseResultSucc(json);

String data = JsonUtil.getString(json, "data");

return data;
}

private static JsonObject parseJsonObject(String res) throws Exception{
JsonObject json = JsonUtil.parseJsonObject(res);

parseResultSucc(json);

JsonObject data = JsonUtil.getJsonObject(json, "data");

return data;
}

private static JsonArray parseJsonArray(String res) throws Exception{
JsonObject json = JsonUtil.parseJsonObject(res);

parseResultSucc(json);

JsonArray data = JsonUtil.getJsonArray(json, "data");

return data;
}
}

2.2 iic-file-dao

mapper, model, service+mybatis-xxx.xml 经典四件套

操作GdssFileTeFile.xml和GdssFileTeWhitelist.xml两张表

2.2.1 GdssFileTeFile.xml

其中SAVE_PATH字段即为文件的保存路径,可以通过https://test-static.gdsinsing.com/TEMP/83d48b7de7014fb48f427b7d1ee2214b.png直接访问到文件,即域名+SAVE_PATH

https://test-static.gdsinsing.com即为文件中心的公网地址

2.2.2 GdssFileTeWhitelist.xml

“ID” “APP_NAME” “PUBLIC_KEY” “PRIVATE_KEY”

授予某应用调用http内部接口的权限

2.3 iic-file-web

2.3.1 cache

2.3.2 controller

2.3.3 service

2.3.3.1 component

(1) BaseUploadFileComponent
1
2
3
4
5
6
7
8
9
10
public abstract class BaseUploadFileComponent extends BaseFileService {
@Autowired
protected ICfgService iCfgService;
@Autowired
protected IGdssFileTeFileService iGdssFileTeFileService;

public abstract LllFileV2 upload(ULFileInfoVo fileInfo, String base64Cont) throws BusException;

public abstract LllFileV2 upload(ULFileInfoVo fileInfo, byte[] contents) throws BusException;
}
(2) UploadFileNormalComponent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**
* 上传普通文件组件
* @author liangxinyi
*
*/
@Component
public class UploadFileNormalComponent extends BaseUploadFileComponent {

private final Log log = LogFactory.getLog(UploadFileNormalComponent.class);

@Override
public LllFileV2 upload(ULFileInfoVo fileInfo, String base64Cont) throws BusException {
//解码
byte[] contents = Base64Util.decode(base64Cont);
return upload(fileInfo, contents);
}

@Override
@Transactional(rollbackFor = Exception.class)
public LllFileV2 upload(ULFileInfoVo fileInfo, byte[] contents) throws BusException {
//入库
GdssFileTeFile file = saveToDb(fileInfo, contents);
//写入硬盘
String savePath = iCfgService.getCfgString("FILE_ROOT_PATH") + file.getSavePath();
try {
String dirPath = findDirectory(savePath);
//创建文件夹,如果文件夹不存在
Files.createDirectories( Paths.get(dirPath) );
//写入文件
Files.write(Paths.get(savePath), contents, StandardOpenOption.CREATE);

return buildLllFile(file);
} catch (Exception ex){
log.error("", ex);
if (ex instanceof BusException) throw (BusException) ex;
throw new BusException("01200002");
}
}

private GdssFileTeFile saveToDb(ULFileInfoVo fileInfoVo, byte[] contents) throws BusException {
String appName = getAppName( fileInfoVo.getToken() );
GdssFileTeFile file = new GdssFileTeFile();
file.setPkidValue( UUID.getUUID() );
file.setAppName(appName);
file.setType(GdssFileTeFile.TYPE_COMMON);
String suffix = FileUtil.getFileExt( fileInfoVo.getOldName() );
file.setFileSuffix(suffix);
file.setCreateTime( Calendar.getInstance().getTime() );
//处理文件名
if ( ToolUtil.isNull( fileInfoVo.getNewName() ) ){
//如果newName为空,则以ID作为文件名
String newName = file.getId();
if( !ToolUtil.isNull( file.getFileSuffix() ) ) {
newName = newName + file.getFileSuffix();
}
file.setFileName(newName);
} else {
file.setFileName( fileInfoVo.getNewName() );
}
String savePath = packSavePath(fileInfoVo, file.getFileName());
file.setSavePath(savePath);
file.setOriginalName( fileInfoVo.getOldName() );
file.setUserId( fileInfoVo.getUserId() );
file.setEncrypt(LllBaseModel.NO);
//预览url
String domain = iCfgService.getCfgString("FILE_ROOT_URL");
String url = domain + "/" + savePath;
file.setUrl(url);
file.setHash( Base64Util.Byte2SHA256(contents) );
//入库
iGdssFileTeFileService.addEntity(file);
return file;
}
}
(3) UploadFileEncryptComponent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* 上传加密文件组件
* @author liangxinyi
*
*/
@Component
public class UploadFileEncryptComponent extends BaseUploadFileComponent {

private final Log log = LogFactory.getLog(UploadFileEncryptComponent.class);

@Override
public LllFileV2 upload(ULFileInfoVo fileInfo, String base64Cont) throws BusException {
// TODO 解密
byte[] contents = Base64Util.decode(base64Cont);
//TODO 保存
return upload(fileInfo, contents);
}

@Override
public LllFileV2 upload(ULFileInfoVo fileInfo, byte[] contents) throws BusException {
try {
GdssFileTeFile file = saveToDb(fileInfo, contents);
//加密
byte[] encryptedBytes = SM4.encrypt(file.getEncryptKey(), contents);

String savePath = iCfgService.getCfgString("FILE_ROOT_PATH") + file.getSavePath();
String dirPath = findDirectory(savePath);
//创建文件夹,如果文件夹不存在
Files.createDirectories( Paths.get(dirPath) );
//写入文件
Files.write(Paths.get(savePath), encryptedBytes, StandardOpenOption.CREATE);

return buildLllFile(file);
} catch (Exception e) {
log.error("", e);
if (e instanceof BusException) throw (BusException) e;
throw new BusException("01200002");
}
}

private GdssFileTeFile saveToDb(ULFileInfoVo fileInfoVo, byte[] contents) throws Exception {
String appName = getAppName( fileInfoVo.getToken() );
GdssFileTeFile file = new GdssFileTeFile();
file.setPkidValue( UUID.getUUID() );
file.setAppName(appName);
file.setType(GdssFileTeFile.TYPE_SECRET);
String suffix = FileUtil.getFileExt( fileInfoVo.getOldName() );
file.setFileSuffix(suffix);
file.setCreateTime( Calendar.getInstance().getTime() );
//处理文件名
if ( ToolUtil.isNull( fileInfoVo.getNewName() ) ){
//如果newName为空,则以ID作为文件名
String newName = file.getId();
if( !ToolUtil.isNull( file.getFileSuffix() ) ) {
newName = newName + file.getFileSuffix();
}
file.setFileName(newName);
} else {
file.setFileName( fileInfoVo.getNewName() );
}
String savePath = packSavePath(fileInfoVo, file.getFileName());
file.setSavePath(savePath);
file.setOriginalName( fileInfoVo.getOldName() );
file.setUserId( fileInfoVo.getUserId() );
//密钥
file.setEncrypt(LllBaseModel.YES);
String key = SM4.generateBase64KeyStr();
file.setEncryptKey(key);
//预览url
String domain = iCfgService.getCfgString("FILE_ROOT_URL");
String url = domain + "/" + savePath;
file.setUrl(url);
file.setHash( Base64Util.Byte2SHA256(contents) );
//入库
iGdssFileTeFileService.addEntity(file);
return file;
}
}
(4) UploadFileSpecifyPathComponent
(5) UploadFileTempComponent

2.3.4 resources

2.3.4.1 application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server:
port: 8097
tomcat:
basedir: /Users/wit/Desktop/temp
spring:
http:
multipart:
maxFileSize: 20MB
maxRequestSize: 20MB
thymeleaf:
prefix: classpath:/templates/
suffix: .html
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
profiles:
active:
- dev
mybatis:
# config-location: classpath:mybatis-config.xml
mapper-locations: classpath*:**/mybatis-*.xml
#type-aliases-package: cn.lll.tsp.model
configuration:
use-actual-param-name: true
cache-enabled: false
#标识业务统计
stat:
redis-ip: 114.67.117.77
redis-pwd: y0aoQ67K62pHrPjp
redis-key: IIC_STAT_DEV
# 配置中心配置
cfg:
FILE_ROOT_PATH: /home/iic/STATIC_ROOT_PATH/
# FILE_ROOT_URL: 启动命令传入

2.3.4.2 application-dao-prod.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
spring:
datasource:
name: prod
url: jdbc:mysql://mysql-cn-south-1-740dbfbd9a254713.rds.jdcloud.com:3306/iic-filecenter-db?characterEncoding=utf8
username: gdxx_file
password: 42RsHfmzOdr1eWaHlxo0OmTnTBGfnGSb
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
test-while-idle: true
time-between-eviction-runs-millis: 3600000
validation-query: SELECT 1;
filters: stat
maxActive: 300
initialSize: 20
maxWait: 5000
minIdle: 5
poolPreparedStatements: true
maxOpenPreparedStatements: 20
# 数据库备份使用
databaseName: eb_yunxin
host: 192.168.4.159
port: 4406
mySqlPath: /usr/local/mysql/
server:
tomcat:
basedir: /home/tomcat/dir/file

3.HTTP接口

3.1 HTTP外部接口

上传文件:https://static.gdsinsing.com/api/v2/ext/upload

查询文件信息:https://static.gdsinsing.com/api/v2/ext/fileinfo/{fileId}

读取文件:https://static.gdsinsing.com/api/v2/ext/{fileId}?key={key}

3.2 HTTP内部接口

申请临时权限令牌:https://{文件中心内网地址}/api/v2/token?authId={authId}

转存临时文件:https://{文件中心内网地址}/api/v2/transfer-temp-file

读取用户图片列表:https://{文件中心内网地址}/api/v2/list

查询文件总数:https://{文件中心内网地址}/api/v2/count

查询文件信息:https://{文件中心内网地址}/api/v2/getFileInfo

删除文件:https://{文件中心内网地址}/api/v2/removeFile

3.3 附件

LllFileV2

概述

文件中心文件对象。

文件类型

属性名 类型 说明
LllFileV2.TYPE_COMMON int 1 公共区文件
LllFileV2.TYPE_SECRET int 2 加密区文件
LllFileV2.TYPE_TEMP int 3 临时区文件

属性说明

属性名 类型 说明
fileId String 文件ID
userId String 用户ID
type Integer 文件类型 (1:公共区 2:加密区 3:临时区)
createTime Date 上传时间
fileName String 文件名(包含后缀)
savePath String 文件保存路径 (不包含文件名)
fileSuffix String 文件后缀
oldName String 文件原名
url String 完整的URL访问地址(包含Https)
secKey String SM4密钥
hash String 文件的Hash值
appName String 系统账号名称,如:IIC
cont byte[] 文件内容

4.SSP

4.1 admin.file.controller

1
2
3
@RestController
@RequestMapping(path = "/mgrapi/admin/file")
public class AdminFileController extends MgrBaseController

内有upload方法

4.2 pages.filecenter.file-upload.js

Vue组件 调controller中的upload方法

4.3 pages.filecenter.file-upload.html