前段日子因为hexo渲染markdown的相对路径非常脑溢血,同样文件的本地看得到图搭建到服务器上要把图放到source里,还要修改markdown文件,索性搞个图床一劳永逸,反正便宜
阿里云oss
搜索oss
直接买最便宜的,半年四块五试试水
然后进入oss管理控制台
创建bucket
名字自己取一个,然后除了读写权限其他都不用动,读写权限改成公共读
创建好之后查看bucket列表进入那个新建的bucket,进入之后好像也没什么需要干的,如果你想要建个文件夹就新建一个
然后我们来看官方文档,来学习一下怎么上传文件
看得出来只是简单的调库,验证完身份之后把二进制文件传给端口之类的小脚本
脚本里有一个accessKey,我们需要先添加一个,鼠标移到右上角的头像,点击accessKey管理,创建一个accessKey,记录下accessKeyId和accessKeySecret,脚本要用到这两个来验证身份
python
终端下安装oss2库pip install oss2
,根据官方文档我们只需要打开要上传的文件就可以了
file=open("target.png",'rb')
之前的验证部分只需要照抄即可,我们随便找个文件测试一下
bucket.put_object('config.txt',file)
之后如果能在服务器上找到上传的文件就说明没问题了
typora
打开typora的偏好设置
点开图像,插入图片时选择上传图片
然后是下面的上传服务设定选择 custom command
然后再让我们来看一下typora的官方文档
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"
然后我们点一下下面的验证图片上传选项
以上就是成功的结果
直接下载问题
如果你以为这么轻松就完成的话,那你就高兴的太早了
你可以试着随便截一张图,然后粘贴到typora里,在upload之后如果它成功显示了,那么恭喜你不需要再做一些额外的配置了,如果你没法直接显示,那么也恭喜你,可以再折腾一会了
官方文档很贴心地告诉你,经过某次更改,默认状态下的图片你是无法预览而是以直接下载的形式打开,很明显typora用的是预览图片,所以他就无法预览图片了…
但是我们还是有办法摆脱这个默认状态的,我们直接指定Content-Type
即可
我在乱翻官方文档的时候发现了可以设置上传header
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