typora + python + 阿里云oss 搭建图床指北
start at 2022/10/08?

前段日子因为hexo渲染markdown的相对路径非常脑溢血,同样文件的本地看得到图搭建到服务器上要把图放到source里,还要修改markdown文件,索性搞个图床一劳永逸,反正便宜

阿里云oss

搜索oss

image-20221008232724642

直接买最便宜的,半年四块五试试水

image-20221008232854585

然后进入oss管理控制台

image-20221008233054868

创建bucket

image-20221008233137889

名字自己取一个,然后除了读写权限其他都不用动,读写权限改成公共读

image-20221008233355997

创建好之后查看bucket列表进入那个新建的bucket,进入之后好像也没什么需要干的,如果你想要建个文件夹就新建一个

然后我们来看官方文档,来学习一下怎么上传文件

image-20221008234549834

看得出来只是简单的调库,验证完身份之后把二进制文件传给端口之类的小脚本

脚本里有一个accessKey,我们需要先添加一个,鼠标移到右上角的头像,点击accessKey管理,创建一个accessKey,记录下accessKeyId和accessKeySecret,脚本要用到这两个来验证身份

python

终端下安装oss2库pip install oss2,根据官方文档我们只需要打开要上传的文件就可以了

file=open("target.png",'rb')

之前的验证部分只需要照抄即可,我们随便找个文件测试一下

bucket.put_object('config.txt',file)

之后如果能在服务器上找到上传的文件就说明没问题了

image-20221010092832799

typora

打开typora的偏好设置

点开图像,插入图片时选择上传图片

image-20221010093852143

然后是下面的上传服务设定选择 custom command

image-20221010094243015

然后再让我们来看一下typora的官方文档

image-20221010095637697

typora的输入是图片的绝对路径,输出是上传图片之后的url地址

这就很好构思脚本了,我们先从命令里获取图片地址,上传图片之后把目标url输出即可

for x in sys.argv:
    file=open(x,'rb')
    upload(file)
    print("xxx/"+x)

中间我们还能自定义一些功能,比如在日志里记录一下上传历史

import oss2,sys,time
auth=oss2.Auth('yourAccessKeyId','yourAccessKeySecret')
bucket=oss2.Bucket(auth,'https://oss-cn-hangzhou.aliyuncs.com','bucketname')
iptlis=sys.argv
log=open('realpath/up.log','a+')
for idx in range(1,len(iptlis)):
    filename=iptlis[idx]
    try:
        file=open(filename,'rb')
    except:
        log.write('[X] read failed '+filename)
    fn=iptlis[idx].split('/')[-1]
    fn2=iptlis[idx].split('\\')[-1]
    if(len(fn)>len(fn2)):
        fn=fn2
    res=bucket.put_object(fn,file)
    if(res.status==200):
        url="http://xxx/"+fn
        log.write('[V] '+filename+'|* '+str(time.time())+' at '+url+' ')
        print(url)
    else:
        log.write('['+str(res.status)+'] '+str(time.time())+' '+filename)
    log.write('\n')
    file.close()
log.close()

然后在typora的 设置-图像-上传服务设定-命令 里指定写下的路径,前面记得加上python,后面记得加个空格

比如python "D:\upload.py"

然后我们点一下下面的验证图片上传选项

image-20221010101754014

以上就是成功的结果

直接下载问题

如果你以为这么轻松就完成的话,那你就高兴的太早了

你可以试着随便截一张图,然后粘贴到typora里,在upload之后如果它成功显示了,那么恭喜你不需要再做一些额外的配置了,如果你没法直接显示,那么也恭喜你,可以再折腾一会了

官方文档很贴心地告诉你,经过某次更改,默认状态下的图片你是无法预览而是以直接下载的形式打开,很明显typora用的是预览图片,所以他就无法预览图片了…

但是我们还是有办法摆脱这个默认状态的,我们直接指定Content-Type即可

我在乱翻官方文档的时候发现了可以设置上传header

image-20221010104803038

headers={'Content-Type':'image/jpg'}这样设置就可以了

最终代码

import oss2,sys,time
auth=oss2.Auth('yourAccessKeyId','yourAccessKeySecret')
bucket=oss2.Bucket(auth,'https://oss-cn-hangzhou.aliyuncs.com','bucketname')
iptlis=sys.argv
log=open('realpath/up.log','a+')
for idx in range(1,len(iptlis)):
    filename=iptlis[idx]
    try:
        file=open(filename,'rb')
    except:
        log.write('[X] read failed '+filename)
    fn=iptlis[idx].split('/')[-1]
    fn2=iptlis[idx].split('\\')[-1]
    if(len(fn)>len(fn2)):
        fn=fn2
    #如下增加代码
    res=bucket.put_object('image-for-pyup/'+fn,file,headers={'Content-Type':'image/jpg'})
    if(res.status==200):
        url="http://xxx/"+fn
        log.write('[V] '+filename+'|* '+str(time.time())+' at '+url+' ')
        print(url)
    else:
        log.write('['+str(res.status)+'] '+str(time.time())+' '+filename)
    log.write('\n')
    file.close()
log.close()

如果还不行那就把https关了

what about picGo

刚刚开始按着网上教程用picGo,但是遇到一些问题难以解决

就是之前的直接下载问题,因为picGo没法自定义发送的内容,如果是在服务器上设置http头,每次上传图片都要重新设置,太麻烦了

虽然可以不用阿里云,但是我已经付了阿里云的钱了

虽然感觉这个其实是阿里云的问题,不过我不是特别喜欢开机挂载的监听服务,之前也有几次软件卡死的情况,所以我就放弃使用picGo了

2022/10/08
> CLICK TO back <