概念

为方便平台用户优雅的管理文件,避免重复造轮子而开发的文件存储服务,后端提供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   作者:伍润源