第三方图床

个人小网站通常会采取使用第三方图床(例如 lsky)的形式来进行图片托管

  • 开发 & 维护成本低
  • 可能的数据泄露(但对于非商业公司问题不大)
  • 需要支付一定费用
  • 存取速度不一定比得上储存在自己的服务器上的方案

以静态文件的形式寄存在服务器中

这是企业通常会采用的方案,直接存到服务器目录中,在需要图片的时候,通过访问服务器静态路径来获得。

以本地数据库搭建图床

这一种方式较为冷门,但对团队中运维同学的技术要求水平较低,并且迁移时会较为方便(数据库的移植比服务器中同时移植所有静态文件方便很多)

具体实现方法会比上述两者在理论上更抽象一点,也需要实际把整个图床都写出来。

定义 getImage 和 uploadImage 接口,在 uploadImage 接口上传想要储存的图片,将图片的数据读取后,以 BLOB 的形式存到数据库中。图片需要生成一个独立的 basename,而实现的方式可以参考 lsky 图床 是如何生成 basename 的

而在 get 接口中,以一个 localhost:8000/api/i/{imageId}.png 的形式定义接口,而非在 json body 中传入所需要获取的图片 id(这样的话,返回图片时浏览器可以直接把图片解析,并且显示在页面上),在接口中,以一个变量的形式来识别并接受这个 imageId,以 go 为例

router.Get("/i/:imageId", GetImage)

然后就只需要根据这个 imageId 来在数据库中寻找对应图片,将图片的数据返回给前端,浏览器就会因为请求的文件以图片文件后缀为结尾,因此识别为一个图像文件,将其直接解析为图片在浏览器上显示(因此,这个 get 接口的链接,是可以直接拼接在一个 md 文件里面,或者让图片直接在一段文本中显示的)。

对象存储 OSS

常见方法之一,OSS 按存储量计费所以储存量高的话会很贵,但本身服务是大厂提供的(如阿里云 OSS)所以不会占用你的服务器带宽

和数据库储存的比较:

  • 服务器带宽多的话,就选数据库储存(不需要计费)
  • 服务器带宽少且储存空间宽裕的话,就选数据库储存
  • 存取速度 OSS 快一点(当然,在万级是体现不出来的)