第三方图床
个人小网站通常会采取使用第三方图床(例如 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 快一点(当然,在万级是体现不出来的)