附件系统服务组件概述
业务需求
提供业务系统与文件服务之间的管理功能,支持单据的上传多个附件的管理功能。
功能说明
- 独立的附件服务系统,支持基本的增、删、改、等等,可以和其他组件集成。
- 支持多种格式的附件上传
- 支持一次选择多个附件
- 支持直传回调、支持回调自定义参数的扩展、支持oss和FastDFS、支持缩略图调节;
- 支持微服务的部署方式;
整体设计
依赖环境
<dependency>
<groupId>com.yonyou.iuap</groupId>
<artifactId>iuap-filesystem-service</artifactId>
<version>${iuap.modules.version}</version>
<type>war</type>
</dependency>
${iuap.modules.version} 为平台在maven私服上发布的组件的version。
功能结构
本组件依赖于文件组件,通过文件组件可适配不同的文件服务器,目前支持FastDFS,阿里的OSS服务。 本组件主要用于业务系统的附件管理功能,提供具体业务单据于单据下多个附件的分组管理功能。通过附件管理表建立业务单据与具体文件的关系,支持业务单据对文件的管理功能。同时屏蔽了不同文件服务器不同接口调用。
使用说明
配置说明:
1.application.properties:阿里云、FastDFS 配置文件,具体可参考文件组件使用说明
#使用的存储类型,选项为FastDfs或AliOss
storeType=FastDfs
#----------------------------------------------------------------------------------------------
#使用FastDfs文件系统时Fdfs系统的配置******
connect_timeout =
network_timeout =
charset =
tracker_server =
fdfsread_server =
#----------------------------------------------------------------------------------------------
#aliyun 采用阿里的文件系统配置
storeDir=
endpoint=
#accessKeyId 是阿里附件系统提供的账户信息
accessKeyId=
accessKeySecret=
#回调的服务器地址,使用直传的时候必须配置
callbackTarget=http://ip:端口
#回调方法:一般不用修改,开发人员扩展使用
callbackUrl=/file/rewrite
callbackBody=filename=${object}&bucket=${bucket}&size=${size}&groupname=${x:groupname}&filepath=${x:filepath}&permission=${x:permission}&modular=${x:modular}
2.iuapfile.properties:阿里云bucket信息配置文件,仅在使用AliOss作为文件服务时使用
#私有bucket
defaultBucket=阿里文件存储的私有账户
#可读bucket==公有
defaultBucketRead=阿里文件存储的公有账户(read权限账户)
3.jdbc.properties:数据库配置文件
#驱动
jdbc.driver=com.mysql.jdbc.Driver
#url地址
jdbc.url=jdbc:mysql://localhost:3306/ssm
#数据库用户
jdbc.username=mysql
#数据库密码
jdbc.password=mysql
#定义初始连接数
jdbc.initialSize=1
#定义最大连接数
jdbc.maxActive=20
#定义最大空闲
jdbc.maxIdle=20
#定义最小空闲
jdbc.minIdle=1
#定义最长等待时间
jdbc.maxWait=60000
注意,war包中不提供数据库驱动,需要手工将驱动放到war的WEB-INF/lib目录下
4.执行数据库脚本
依次执行examples项目下sql目录中的dll.sql、index.sql、dml.sql建立数据库并初始化数据。
示例工程说明:
文件说明: index.jsp ---使用示例,包含说明信息。
ossupload.js ---直传的js文件
ajaxfileupload.js ---附件上传插件js,不支持跨域。跨域模式在index.jsp中存在例子
interface.file.js ---ajax访问方式 接口文件,里面是需要实现的方法
interface.file.impl.js ---是interface.file.js的实现,包括所有的基本js
【以上js文件使用的时候需要同时引用这4个js,顺序为ossupload.js、ajaxfileupload.js、interface.file.js、interface.file.impl.js】
开发步骤
导入js文件
<script type="text/javascript" src="<%=request.getContextPath()%>/resources/js/ossupload.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/resources/js/ajaxfileupload.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/resources/js/interface.file.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/resources/js/interface.file.impl.js"></script>
web前端调用附件方法示例
- 基本方法:以上传附件举例
function upload(){
var par = {
fileElementId: "uploadbatch_id",
filepath: "code",
groupname: "single",
permission: "read",
url: true,
thumbnail : "500w", }
var f = new interface_file();
f.filesystem_upload(par,callback);//callback是上面定义的回调函数 }
- 回调函数:处理过程,一遍业务编写,
代码示例如下:
/** * 回调函数--返回结果*/
var callback = function(data){
if(-1 == data.status){//后台校验信息状态
var warn = "";
for(var k in data.message){
data.message[k].ObjectName //校验的对象名称
data.message[k].Field //校验的字段名称
data.message[k].RejectedValue //校验的错误原因
data.message[k].DefaultMessage; //校验的错误提示信息
warn +=data.message[k].ObjectName+"对象的"+ data.message[k].Field+"属性不能为:"+data.message[k].RejectedValue +"\n"; //自己拼的方式
warn +=data.message[k].DefaultMessage +"\n"//后台的默认信息
}
alert(warn);
}else if(1 == data.status){//上传成功状态
//业务代码
}else if(0 == data.status){//上传失败状态
//业务代码
}else{//error 或者加載js錯誤
alert(data);
}
};
登录用户的信息
默认的用户传递方式时cookies中,指定usercode为用户的编码或主键,如果业务上使用其他的cookies值,请重写fileserver-spring-mvc.xml中的拦截器,
<mvc:interceptors>
<!-- session超时 -->
<mvc:interceptor>
<mvc:mapping path="/*/*"/>
<bean class="com.yonyou.iuap.generic.adapter.CookiesInterceptor">
<property name="exclude">
<list>
<!-- 如果请求中包含以下路径,则不进行拦截 -->
<value>/login</value>
<value>/js</value>
<value>/css</value>
<value>/image</value>
<value>/images</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
在拦截器中使用InvocationInfoProxyAdapter.setUserid(userid);设置用户编码或主键。
interface.file.js
在web前端的代码中直接使用以下接口方法
附件上传
描述
附件上传
请求方法
filesystem_upload(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
fileElementId | True | String | 无 | 一般为为要提交文件的input标签的ID |
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
permission | False | String | 20 | read/private,read-公有(即文件不受权限控制,有路径即可访问),private-私有(访问文件前需要调用附件的getURL方法获取认证信息,否则无法访问),不传的时候会默认private |
url | False | boolean | 无 | 是否返回附件的url地址 |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
isreplace | False | boolean | 无 | 是否覆盖,当filepath,groupname和filename都相同时是否覆盖掉之前上传的附件,默认为:false, |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”}] |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件查询
请求方法
filesystem_query(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”}] |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件下载
请求方法
filesystem_download(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 附件的ID |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 具体文件对象 |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件删除
请求方法
filesystem_delete(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 附件的ID |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 空 |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
获得附件的url
请求方法
filesystem_geturl(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
ids | True | String | 无 | 附件的ID数组,格式如下"id1,id2,id3..." |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 空 |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件覆盖上传
请求方法
filesystem_replace(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
fileElementId | True | String | 无 | 一般为为要提交文件的input标签的ID |
id | True | String | 最长36,一般19 | 需要被覆盖的附件ID |
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
permission | False | String | 20 | read/private,read-公有(即文件不受权限控制,有路径即可访问),private-私有(访问文件前需要调用附件的getURL方法获取认证信息,否则无法访问),不传的时候会默认private |
url | False | boolean | 无 | 是否返回附件的url地址 |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”} |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件更新
请求方法
filesystem_update(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 需要被覆盖的附件d的ID |
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”} |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
直接上传文件服务器
请求方法
ossupload(parameter,callback)
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
fileid | True | String | 无 | 一般为为要提交文件的input标签的ID |
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
permission | False | String | 20 | read/private,read-公有(即文件不受权限控制,有路径即可访问),private-私有(访问文件前需要调用附件的getURL方法获取认证信息,否则无法访问),不传的时候会默认private |
url | False | boolean | 无 | 是否返回附件的url地址 |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”} |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件管理RestAPI
附件上传
描述
附件上传
请求方法
file/upload
请求方式
POST
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
permission | False | String | 20 | read/private,read-公有(即文件不受权限控制,有路径即可访问),private-私有(访问文件前需要调用附件的getURL方法获取认证信息,否则无法访问),不传的时候会默认private |
url | False | boolean | 无 | 是否返回附件的url地址 |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
isreplace | False | boolean | 无 | 是否覆盖,当filepath,groupname和filename都相同时是否覆盖掉之前上传的附件,默认为:false, |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”}] |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件查询
请求方法
file//query
请求方式
GET
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”}] |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件下载
请求方法
file/download
请求方式
GET
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 附件的ID |
stream | false | String | 10 | "true" |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 具体文件对象 |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件删除
请求方法
file/delete
请求方式
GET
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 附件的ID |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 空 |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
获得附件的url
请求方法
file/url
请求方式
GET
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
ids | True | String | 无 | 附件的ID数组,格式如下"id1,id2,id3..." |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 空 |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件覆盖上传
请求方法
file/replace
请求方式
POST
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 需要被覆盖的附件ID |
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
permission | False | String | 20 | read/private,read-公有(即文件不受权限控制,有路径即可访问),private-私有(访问文件前需要调用附件的getURL方法获取认证信息,否则无法访问),不传的时候会默认private |
url | False | boolean | 无 | 是否返回附件的url地址 |
thumbnail | False | String | 10 | 缩略图大小设置,例如“500w”,一般仅图片文件使用和url参数配合使用 |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”} |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |
附件更新
请求方法
file/replace
请求方式
POST
请求参数说明
参数字段 | 必选 | 类型 | 长度限制 | 说明 |
---|---|---|---|---|
id | True | String | 最长36,一般19 | 需要被覆盖的附件d的ID |
filepath | True | String | 100 | 附件路径,单据相关的唯一标示,一般为单据ID |
groupname | True | String | 100 | 分組名称,一般在一个单据下存在比较多附件时管理使用,与filepath一起做为文件的管理纬度< |
返回参数说明
返回:"data":{"message":"提示信息","status":0,"data":[]}
参数字段 | 返回值说明 |
---|---|
status | 状态,1-成功,2-失败,-1-警告 |
data | 返回的数据,json格式,
具体内容格式如下:[{"id":"附件id","filename":“文件名”,"filesize":“附件大小”,“filepath”:“附件的路径”,“groupname”:“分組”,“uploadtime”:“上传时间”,“url”:“下载地址”} |
message | 返成功或错误信息,一般为成功提示或错误描述,当status为-1时,返回具体批量操作的详细错误,
格式如下[{"ObjectName":"校验的对象名称","Field":“校验的字段名称”,"RejectedValue":“错误原因”}] |