为了账号安全,请及时绑定邮箱和手机立即绑定

Python玩转阿里云OSS对象存储,批量转存markdown和html图片

标签:
Python

今天我又在玩自己的博客了,偶然发现我从语雀批量导入的文章,在手机端图片只显示一部分,怀疑是网站防盗链,于是想把图片全部转移到我的阿里云对象存储里面。

但是找了半天都找不到现成的工具和代码,无奈只能自己写一个了,感兴趣请看我的 github https://github.com/pzqu/picture_urls_to_oss

涉及Python知识点:

  1. 文件的写入写出
  2. 正则替换和查找
  3. 随机生成不重复的uuid
  4. 阿里云oss包
  5. 下载Url资源

简单知识点:

  1. 循环

对象存储?

想要建站最好把图片存储在对象存储里,然后开cdn加速,这样不仅可以减轻自己服务器的存储压力,同时阿里/腾讯会用他们的服务器和技术让你的图片加载的速度飞快,轻易不会产生数据丢失。

找到对象存储,申请即可,拿到访问密码信息。

核心代码讲解

因为wordpress的博客文章是存储的mysql数据库里的

  1. 只要导出sql脚本
  2. 找到文件里的所有匹配的url,把图片下载下来
  3. 再上传到oss
  4. 最后替换sql文件,再导入回去就行了

获取匹配的url

读取文件,把匹配的url拿到

f_obj = open(file_name, 'r+', encoding="utf-8")
contents = f_obj.read()

reg = re.compile('\(https://cdn\.nlark\.com/yuque.*?\)')
url_markdown = reg.findall(contents)

用字典存起来

把拿到的url当作key存到dict

    for i in url_markdown:
        img_dic[i[1:-1]] = {
            "img": "",
            "oss": ""
        }

下载图片

def download_img(pic_url):
    name = get_random_pic_name(pic_url)
    r = requests.get(pic_url, stream=True)
    f = open(img_dic_path + "/" + name, "wb")
    for chunk in r.iter_content(chunk_size=512):
        if chunk:
            f.write(chunk)
    return img_dic_path + "/" + name

上传图片到对象存储

def oss_upload(upload_path, src_path):
    auth = oss2.Auth(AccessKeyID, AccessKeySecret)
    bucket = oss2.Bucket(auth, EndPoint, BucketName)
    bucket.put_object_from_file(upload_path, src_path)

替换文件中的老url

def alter(file, old_str, new_str):
    with open(file, "r", encoding="utf-8") as f1, open("%s.bak" % file, "w", encoding="utf-8") as f2:
        for line in f1:
            f2.write(re.sub(old_str, new_str, line))
    os.remove(file)
    os.rename("%s.bak" % file, file)

比较蛋疼的是写完才发现,是手机端不支持webp格式的图片,明天再看吧。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消