附件数据存储服务
默认情况下,附件都存储在共享的磁盘上;
本服务可以将附件同时转储到其他目标中(如数据库、阿里云OSS等);
一旦启用附件转储,本地磁盘上的附件会被定时清理。
如果需要和网盘等第三方存储系统进行集成,可以继承并实现本类的几个 abstract 方法即可(注意代码放到 src/groovy 下,而不是 grails-app/services)。
通常情况下,save 失败应直接抛出异常、而 delete 失败应调用方法 deleteFailed 自动记录并重试。
在 grails-app/conf/application.xxx 中启用,配置
bropen.framework.resource.attachment.storage.clazz = "类名"
| Type | Name and description |
|---|---|
Integer |
delete(List<String> saveNames, List<String> syncIds)删除转储的附件,并返回删除的附件数量 |
protected void |
deleteFailed(List<String> saveNames, List<String> syncIds)删除失败时,记录并自动重试 |
void |
deleteRetry() |
boolean |
exists(String saveName, String syncId)判断文件是否存在 |
EncodedInputStreamWrapper |
getEncodedInputStream(javax.servlet.http.HttpServletRequest request, String saveName, String syncId)获得可用于下载的压缩附件流 |
java.io.InputStream |
getInputStream(String saveName, String syncId)获得附件流,用于附件下载、内容解析(Search)等 |
Long |
getLength(String saveName, String syncId, Long length)获得文件大小 |
String |
getUrl(String saveName, String syncId, String fileName, Long length, String contentType, Date expiration)获得文件的下载地址 |
boolean |
isEnabled()附件存储服务是否启用 |
String |
save(String saveName, java.io.InputStream is, String fileName, Long length, String md5)附件转储 |
void |
setEnabled(Boolean enabled)启用、禁用附件存储服务 |
boolean |
shouldKeepLocalCopy(String fileName, Long length)附件上传时,是否有必要在本地保存一份副本 |
Integer |
transfer(List<Attachment> attachments, boolean deleteFile)工具方法:迁移本地存储中的附件、并删除本地存储中的文件 |
| Methods inherited from class | Name |
|---|---|
class Object |
Object#wait(long, int), Object#wait(long), Object#wait(), Object#equals(Object), Object#toString(), Object#hashCode(), Object#getClass(), Object#notify(), Object#notifyAll() |
删除转储的附件,并返回删除的附件数量
删除失败时,务必调用 deleteFailed 方法记录下来。
saveNames - 本系统中的文件唯一标识syncIds - 目标系统中的文件唯一标识(save 的返回值),和 saveNames 一一对应;使用时注意非空判断删除失败时,记录并自动重试
判断文件是否存在
获得可用于下载的压缩附件流
request - 请求对象,可以根据 Accept-Encoding 头来判断是否支持压缩获得附件流,用于附件下载、内容解析(Search)等
saveName - 本系统中的文件唯一标识syncId - 目标系统中的文件唯一标识(save 的返回值)获得文件大小
仅当 bropen.framework.resource.attachment.validate 启用,并且在下载文件的时候,校验文件是否被篡改。
因此,如果未启用校验、或无需校验、或不支持获取文件大小,可以直接返回参数 length 即可。
获得文件的下载地址
如果返回 null,则通过 getInputStream 下载。
需要注意设置下载的文件名(如果支持的话)。
fileName - 下载的文件名,通常应该设置到下载的 Content-Disposition 响应头中contentType - 文件的 contentType,默认为空(需要自行计算)expiration - 链接失效时间,默认为一天,即 new Date() + 1。附件存储服务是否启用
附件转储
saveName - 本系统中的文件唯一标识is - 文件的输入流,转储结束后,务必执行关闭(close)操作length - 文件长度md5 - 文件 md5 值启用、禁用附件存储服务
附件上传时,是否有必要在本地保存一份副本
比如某些类型、或者小于一定大小的文件,才保存到第三方存储中。
fileName - 文件名length - 文件大小工具方法:迁移本地存储中的附件、并删除本地存储中的文件
attachments - 附件列表deleteFile - 迁移后是否删除本地存储中的文件,请谨慎设置