概念
为方便平台用户优雅的管理文件,避免重复造轮子而开发的文件存储服务,后端提供JAVA SDK,WEB前端配合使用附件组件
目前已适配阿里云OSS、华为云OBS、腾讯云COS、Amazon S3、Minio
- 附件 attachId 常见的表单中的附件选项 、 头像 、轮播图 等
- 文件 fileCode 即附件中的文件
- 一个附件中可以有多个文件
- 附件分私密或公开两种类型,私密附件只能是所有者带token才能获取,公开附件通过attachId或fileCode就能获取。
获取存储服务配置
有套件
开发中心-应用套件-套件详情-开发资源-开通存储服务
无套件
运营管理后台-开发管理-OSS配置-添加
后端使用
nacos增加配置
- appId: 开发资源中的APP ID
- appSecret:在开通开发资源时得到
pai: resource: appId: 123456 appSecret: abcdefg
pom.xml
<dependency> <groupId>cn.flyrise</groupId> <artifactId>pai-common-oss</artifactId> </dependency>
SDK(服务端上传OSS)
isSecret 是否私密 的用处:
如果为true,则获取文件时需带上token或配置,为false时,只通过附件ID或者文件ID则可以获取
public class OssClient {
/**
* 存储文件
*
* @param file File对象
* @param attachId 附件ID
* @param isSecret 是否私密
* @param uploadBy 上传者
* @param suffix 文件后缀
* @param orgFileName 文件原名
* @return attachId
*/
public String put(File file, String attachId, boolean isSecret, String uploadBy, String suffix, String orgFileName);
/**
* 存储文件(自定义附件ID)
*
* @param file File对象
* @param attachId 附件ID
* @param uploadBy 上传者
* @return attachId
*/
public String put(File file, String attachId, String uploadBy);
/**
* 存储文件(由系统生产附件ID)
*
* @param file File对象
* @param uploadBy 上传者
* @return attachId
*/
public String put(File file, String uploadBy)
/**
* 存储私密文件
*
* @param file File对象
* @param attachId 附件ID
* @param uploadBy 上传者
* @param suffix 文件后缀
* @return attachId
*/
public String putSecret(File file, String attachId, String uploadBy, String suffix);
public FileObject save(MultipartFile multipartFile, String attachId, boolean isSecret, String uploadBy, String suffix, String orgFileName);
public FileObject save(MultipartFile multipartFile, String uploadBy);
public FileObject save(MultipartFile multipartFile, String attachId, String uploadBy);
public FileObject saveSecret(MultipartFile multipartFile, String uploadBy);
public FileObject saveSecret(MultipartFile multipartFile, String attachId, String uploadBy);
public FileObject save(File file, String uploadBy);
public FileObject save(File file, String attachId, String uploadBy);
public FileObject saveSecret(File file, String uploadBy);
public FileObject saveSecret(File file, String attachId, String uploadBy);
/**
* 根据fileCode获取文件
*
* @param fileCode 文件唯一码
* @return byte[]
*/
public byte[] get(String fileCode) ;
/**
* 根据fileCode获取文件
*
* @param fileCode 文件唯一码
* @return InputStream对象
*/
public InputStream getInputStream(String fileCode) ;
/**
* 根据attachId获取文件
* 一个attachId对应一个fileCode时使用
*
* @param attachId 附件ID
* @return byte[]
*/
public byte[] getByAttachId(String attachId);
/**
* 根据attachId获取文件
* 一个attachId对应一个fileCode时使用
*
* @param attachId 附件ID
* @return InputStream对象
*/
public InputStream getInputStreamByAttachId(String attachId) ;
/**
* 根据attachId获取文件列表
*
* @param attachId 附件ID
* @return 列表
*/
public List<FileObject> list(String attachId);
/**
* 根据attachId获取文件列表
*
* @param attachId 附件ID
* @return JSON格式字符串类型
*/
public String listStr(String attachId) ;
/**
* 根据attachId获取文件信息,一个attachId对应一个fileCode使用
*
* @param attachId 附件ID
* @return FileObject对象
*/
public FileObject queryOne(String attachId) ;
/**
* 删除附件中的多个文件
*
* @param attachId 附件ID
* @param fileCodes 文件唯一码 数组
* @return 结果
*/
public boolean delete(String attachId, String[] fileCodes);
/**
* 删除附件中的单个文件
*
* @param attachId 附件ID
* @param fileCode 文件唯一码
* @return 结果
*/
public boolean delete(String attachId, String fileCode);
/**
* 删除附件中的所有文件
*
* @param attachId 附件ID
* @return 结果
*/
public boolean delete(String attachId);
/**
* 表单模式,保存时修改文件标记(多附件)
*
* @param attachId 附件ID 列表
* @return 结果
*/
public boolean complete(List<String> attachId);
/**
* 表单模式,保存时修改文件标记
*
* @param attachIds 附件ID
* @return 结果
*/
public boolean complete(String... attachIds) ;
/**
* 复制附件
*
* @param attachId 来源附件ID
* @param newAttachId 新附件ID(可不填)
* @return 新附件ID
*/
public String copy(String attachId, String newAttachId);
/**
* 获取OSS服务令牌
*
* @param uploadBy 上传者/操作者
* @return token
*/
public OssObject token(String uploadBy);
}
使用
@Resource
private OssClient client;
WEB前端组件
详见PaiUI:
说明:
附件上传到存储服务。业务端只需要保存附件ID(32位UUID)即可。
一个附件ID可对应多个文件。
后端可通过SDK操作附件。
WEB端和小程序端皆有提供组件展示附件。
因前端可能多次上传附件,但是最后并未保存表单,
为了和表单状态一致且避免资源浪费,都需要后端在保存表单时去存储服务确认。
使用流程
- 前端带上登录用户的token,向后端请求OSS的token
- 后端接口地址为 /后端二级目录/oss/token
- 后端接口返回OSS的token给前端 (以上步骤只需在nuxt.config.js中isOss设为true)
- 前端请求 /oss-api/oss/v1/upload 接口上传文件,并得到attachId
- 如果是替换文件,须传入attachId和要被替换的fileCode,否则视为添加文件(前端组件已实现这段)
- 前端保存表单时带上attachId
- 后端保存表单并调用OssClient.complete方法确认存储附件
文档更新时间: 2022-11-29 11:32 作者:伍润源