在上传用户的图片之前,前端可对图片进行缩放并选择最优的格式转化,然后上传服务器或下载另存。当前支持以下功能。
开发这个功能是因为:最开始我们也觉得原始图片很重要,所以我们的上传方案是用户上传,原图保存,然后前端请求的时候,在路径上加上参数然后后端生成对应的缓存图片供下载展示,这样就牺牲了服务器的硬盘空间和图片处理的开支(尽管相同的请求参数只需要处理一次)。而后来我们发现其实用户上传的图片质量并不高,一般用手机拍一下就上传了,而现在的手机相机的像素都很高,所以生成的图片会很大,最后实际用来展示的,往往只需要1000-2000像素左右,所以还不如在上传的时候直接压缩掉。
后来我们也为了稳定性和扩展性,决定使用阿里云的OSS服务,需要将这些图片都上传到OSS上。 这个时候,我们自己图片服务器上的空间占用已经接近1T(包含很多缓存图片,为了加速避免重新生成,不会自动清理),最后上传到OSS后,超过了520G.
整个过程大致分成以下几步:
1、最开始用bat+ossutil命令行工具遍历上传,bat负责目录遍历,跳过缓存文件和缓存目录,ossutil工具负责图片上传,近上传原图。
2、随着理解的加深(原图的上传和使用的关系、OSS结合CDN效率和费用方面的理解等),决定用户上传的图片不再上传原图,限制最大宽度和高度,所以决定将原图转化后重新上传。由于这些是以前上传的图片,已被引用,所以不能更改图片扩展名。执行又分成了两个阶段:
1、bat+命令行图片编辑工具+ossutil,不过在寻找命令行图片编辑工具上并不太顺利;
2、改用python的pillow来处理图片,如此一来,发现bat和ossutil都可以用python来替换,相当方便
3、对于以后用户将上传的图片,前端直接转换限制最大宽高,同时因为数据库还未对文件产生引用,所以图片格式可以择优选择,这是尝试编写这个工具和库的原因,主要用到的功能是:限制图片最大宽高、择优选择png/jpg,webp兼容性不够好,所以服务器上不能保存webp格式的,通过cdn下载的时候,可以设置让cdn自动帮转成webp的。
目前还在压缩中,已经上传的空间压缩到了200G左右,所以节省一半的存储空间,自然回源的流量也会同步减少。
软件架构说明
下载即可使用
参考example.html
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。