???? 图床是什么

我们在工作生活中,有一些图片想​​展示给​​其他人,在没有微信/QQ这样的聊天工具的时候,比如在论坛里,我们该怎么把我们本地的jpg展示给其他人呢?

整个过程大概是这样:


  1. 上传图片到帖子里面,这时候服务器会接受该图片,并放入自己的图片服务器(也就是图床)
  2. 由于url的唯一性,每个图片都是有自己唯一的地址,所以帖子的其他浏览者,就可以通过地址看到你上传的图片了

所以这里的图床就是指​​图片服务器​​(我是这么理解的)。

???? 为什么需要图床

举个例子,我们有用过markdown的小伙伴都遇到过插入图片的情况。那如果你的图片在本地,你的markdown就只能在​​本地​​正常预览。

一旦你要把markdown贴到某些论坛,比如testerhome,那你的markdown里的图片就失效了(因为路径是本地比如C:\Users\xxx.jpg)。

有的同学可能会怀疑,我发到testerhome这样的论坛,他们自动会给我上传好图片呀,到时候用他们的链接不就好啦?

你的想法非常好,但是就是因为服务器在人家那里,就导致人家可以做一些防盗链的操作,导致某些时候你访问不到自己的图片。

比如你在简书发表了一些文章,同样的markdown拿到博客园再发一遍,图片就​​全挂了​​。就不能做到一图多用了。

再者,如果你一个web服务器,有很多用户头像,存储base64的话,会很占空间。如果放到http://www.nidetupian.com/abc.jpg 这样的地址,该多好。

???? 下面就来看看图床的效果吧

自制一个免费的图床_github

这是我自己做的一款图床,可以自动传图片到图床,然后有它自己独一份的url,不信你试试这个链接。做这个的目的还是为了更好地支持自己的markdown编辑器,虽然很挫,但是够用就行。

​https://gitee.com/woodywrx/picture/raw/master/2021-11-23/1637656027-image.png​

???? 常见的图床

其实不只是图床,一些比较小的文件,比如图片,txt这样的静态资源文件都是可以放到服务器的。

常见的有以下几种:


  • oss
    大名鼎鼎的oss大家估计都听过,全称呼是对象存储服务,基本也就是个文件服务器,可以存储你本地的文件,给你链接让你预览,上传下载等。这样的服务对于​​图片​​来说,自然就不在话下了。
    常见的有阿里云oss,七牛云,腾讯云cos等。但他们都有个共同的缺点,收费,而且存储收费,读取的时候还收流量费。
  • github page
    这是今天要讲的重点,毕竟没什么比​​白嫖​​更开心了。但是github在国内经常被墙,我们来讲讲gitee。
    gitee中文名是码云(码爸爸,阔绰),它基本算是国内的github,里面也托管了不少​​代码仓库​​。
    所以他自然是支持github page的,也就是静态资源服务器。这意味着我们可以把图片放到他们服务器,并通过他们给定的url访问。(目前他们还没搞防盗链,应该也不会搞)
    最重要就是免费呀。

???? 配置gitee图床


  • 新建一个仓库
    名字随便取都可以。
  • 进入服务->gitee page

自制一个免费的图床_git_02

注意里面需要​​实名认证​​,最近才需要的,所以大家有需要的可以认证一下。

  • 申请token
    按照指示配置好以后,我们需要申请自己的token,这个token是用来创建文件、提交文件的。(毕竟是git相关的操作)

自制一个免费的图床_服务器_03

到个人设置页面生成token即可。

???? 整体思路

其实本质上我们上传图片后,调用gitee的​​创建文件​​的接口就可以了,当然我们需要3个参数:


  • owner
    gitee用户名
  • repo
    仓库名
  • token
    你刚才申请的token
  • content
    base64编码的字符串(文件转换而成)
  • filepath
    要创建的文件的路径,如果有目录就是: ​​目录/文件名​

???? 后端代码

这里展示了一个完整的Gitee创建文件的过程,用到了第三方库: ​​resty​​作为http请求库。

type GiteeRepo struct {
user string
repo string
token string
}

func NewGiteeRepo(user, repo, token string) *GiteeRepo {
return &GiteeRepo{
user: user,
repo: repo,
token: token,
}
}

// CreateFile create image file in gitee according to timestamp
func (g *GiteeRepo) CreateFile(img string) (string, error) {
client := resty.New()
// 获取当前日期,作为目录
date := time.Now().Format("2006-01-02")
// 获取当前时间戳+image.png作为文件名,防止重复
filepath := fmt.Sprintf("%v/%v-image.png", date, time.Now().Unix())
// 发送http请求,body是token 提交信息和文件内容(base64)
resp, err := client.R().
EnableTrace().
SetBody(map[string]string{"access_token": g.token, "message": "from mdnice_plus", "content": img}).
Post(fmt.Sprintf("https://gitee.com/api/v5/repos/%s/%s/contents/%s", g.user, g.repo, filepath))
if err != nil {
return "", err
}
if resp.StatusCode() != 201 {
return "", fmt.Errorf("create file failed")
}
// url是你提交后,仓库返回的地址,由用户名/仓库/文件路径这些数据构成
url := fmt.Sprintf("https://gitee.com/%s/%s/raw/master/%s", g.user, g.repo, filepath)
return url, nil
}

还需要补充的是​​服务器接收​​​上传的图片文件,判断是否是正常的​​图片文件​​格式,接着把图片转换为base64,由于篇幅原因,我们就不赘述了。

到此,一个我们自己的​​图床​​​就制作好了,如果你不介意,也可以往里面放txt,json等浏览器能识别的内容,总体还是​​挺好用​​的。

可以​​设置私人仓库​​,存放一些自己不是很私密,但又没地方备份的东西。那就不仅仅是图床功能啦。

喜欢用typora的也可以看看gitee和它的结合: