Solo 内置 HTTPS + CDN 文件存储

本贴最后更新于 2024 天前,其中的信息可能已经时移世改

本文是《Solo 从设计到实现》的一个章节,该系列文章将介绍 Solo 这款 Java 博客系统是如何从无到有的,希望大家能通过它对 Solo 从设计到实现有个直观地了解、能为想参与贡献的人介绍清楚项目,也希望能为给重复发明重新定义博客系统的人做个参考 ❤️

自 v3.0.0 开始,Solo 内置了 HTTPS + CDN 文件存储,用户只需配置好 B3 Key 就可以直接使用,允许上传的最大单个文件为 10M。

背景和动机

早期的 Solo 是支持用户自己配置七牛云、阿里云 OSS 的,随着用户反馈使用情况,我们注意到几个问题:

  1. 需要自行创建、配置第三方对象存储服务,虽然不困难,但对于大部分人来说还是有点繁琐
  2. 要使用第三方对象存储服务的 HTTPS + CDN 是需要付费的

另外,对于使用服务器本地存储我们是不赞成的:

  1. 服务器带宽一般较小,如果要高速渲染图片或下载文件对带宽有一定要求
  2. 自己运维的服务器相对于第三方服务来说不是非常可靠,较容易造成数据丢失
  3. 迁移服务器需要迁移文件图片,这一步运维操作很容易被遗漏

所以我们比较推荐用户使用第三方对象存储服务。但如果每个用户都要去做一次第三方对象存储配置的话不如让社区统一来做一次,这样在整体上是效率最高的,可以在很大程度上方便用户。

使用方式

  1. 在管理后台 -> 工具 -> 用户管理中选择用户并更新 B3 Key
  2. 在社区个人设置 - B3 中更新为和博客端一样的 B3 Key

配置好后博客端就可以通过编辑器直接上传文件或者图片了,数据会被存储在社区维护的七牛云对象存储服务中,并且配置了 HTTPS + CDN。

实现流程

技术方面主要通过浏览器 CORS 实现跨域上传,完整的交互流程请看下图。

1. 获取上传凭证并在本地缓存

sequenceDiagram 用户浏览器->>+Solo: 访问后台 alt 缓存的上传凭证没过期 Solo-->>用户浏览器: 填充模板返回 else 缓存的上传凭证已过期 Solo->>+社区: 根据用户名、B3 Key 获取上传凭证(HTTP GET) 社区-->>-Solo: 返回上传凭证 Solo->>Solo: 刷新上传凭证缓存 Solo-->>用户浏览器: 填充模板返回 end

2. 用户浏览器 CORS 跨域上传

为了简单,只画了正常成功情况的交互,并省略了一些校验处理细节。

sequenceDiagram 用户->>+浏览器: 上传文件,请求的 URL 为社区文件接口 浏览器->>+社区: 判断为非简单请求,发起预检(HTTP OPTIONS) 社区-->>-浏览器: 响应预检,标头 Access-Control-* 浏览器->>社区: 上传凭证标头 X-Upload-Token 并上传文件 社区->>七牛云: 上传文件到对象存储服务 社区-->>浏览器: 返回上传文件的 URL 浏览器-->>-用户: 上传完毕,编辑器自动插入文件链接

关于 CORS 的更多知识可参考阮一峰前辈的文章:跨域资源共享 CORS 详解

靠爱发电

目前社区的图床服务完全是靠爱发电,所以请大家不要滥用:

  • 请仅在博客端使用,不要外链
  • 请勿上传非法违规图片或文件

欢迎通过社区赞助系统对我们进行支援 💝

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • medusar 2 评论
    该回帖仅作者和楼主可见
    1 操作
    88250 在 2019-08-10 00:08:24 折叠了该回帖
    调用百度 TTS 接口做的
    88250
    @88250 恩恩,了解了,谢谢
    medusar
  • zhaop33

    图床上上传的图片怎么删除,有接口吗

    1 回复
  • 88250

    内容中不要使用即可。

  • zhaop33

    在社区的文件列表里面能看到

    1 回复
  • 88250

    文件列表只有你自己能看,其他人访问不了的。

  • kenel

    博主,我想用阿里云的 OSS 存储文件,可以下载哪个版本呢?

    1 回复
  • 88250

    如果有自己管理文件存储的需求,可以使用第三方工具管理,博文中插入 URL 引用。

  • zylhl

    本来我还想是用 GitHub 建个仓库存图片,然后手动将默认的 raw 地址域名改成 cdn.jsdelivr.net 来白嫖 jsdelivr 的 cdn 作为图床的,结果我刚把地址输上去,自动就给我转化成社区的地址了。不多说,Solo 牛皮!

  • minmaxtec

    想在公司内网部署成为大家交流经验分享的一个地方。

    1 回复
  • 88250

    Solo 不适合内网环境,因为需要和链滴社区联动。

请输入回帖内容 ...