文章首发于:clawhub.club


因为每张图片上传后,都会分发到不同的图床中,库中也就存储了多张真实的url和一张虚拟的url。用户拿到虚拟URL后,访问浏览器,之后系统重定向到真实的url。

这里有个问题:免费的图床,不稳定,URL会失效。如何实时的更新图床url是个问题。

目前想到两个方案:

1,周期性扫描并请求所有url,发现失效的url之后,获取到其有效的图片后,重新上传到当前图床,更新此url。这样做的优点就是,对用户友好,拿到的永远是生效的URL,如果虽然也会有一些时间差,在这之间和、可能会有失效的URL。

2,因为这是个API应用,所以,用户每次都拿一份真实的url,如果失效了,点击刷新,重新获取另一个URL,如果还是失败的,那就再刷新,因该不会有太多的不靠谱url吧。即后端要留一个刷新的口子,根据用户发来的虚拟URL和失效URL,首先返回另一个真实URL,再异步更新这个图床的图片数据。这一方案的优点就是能减少系统的资源,缺点就是用户要刷新图片,可能不友好。

天下没有免费的午餐,既然吃着这个,那就得忍受他的缺点。
还有就是这种免费的图床,因为上传到被人的库里面,你是不知道他吗、拿你的数据会做什么,所以不能上传不好的,隐私的,重要的东西。

我当前选择的是方案二,反正是自己用着玩,节省资源最重要。

获取URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//获取图片
func GetImage(c *gin.Context) {
mainUrl := c.Param("mainUrl")
url := service.Download(mainUrl, "guest")
if url != "" {
c.Redirect(http.StatusMovedPermanently, url)
}
c.String(http.StatusNotFound, "image not found")
}
//下载
func Download(mainUrl, email string) (url string) {
fb, err := dao.QueryOne(mainUrl, email)
if err != nil {
return ""
}
return fb.Url
}

刷新的逻辑还没写完,反正目前不需要,等用的时候再搞。