在 typora 中使用 Node 脚本上传图片

391 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

在使用 typora 写文章的时候,总是会遇到贴图的问题,typora 默认使用本地图片,我们在将文章贴给别人或者上传到其他地方的时候,总是不方便。如果拥有图库,那可以通过写脚本的方式,自动上传图片并替换为远程的 URL

前期准备

编写 node 脚本

// path/scripts/typora_upload_image.jsconst path = require('path')
const Minio = require('minio')
​
// 解析参数, 获取图片的路径,有可能是多张图片
const parseArgv = () => {
  const imageList = process.argv.slice(2).map(u => path.resolve(u))
  return imageList
}
​
// 入口
const uploadImageFile = async (imageList = []) => {
  // 创建连接
  const minioClient = new Minio.Client({
    // 这里填写你的minio后台域名
    endPoint: 'minio 地址',
    port: 9000,
    useSSL: false,
    // 下面填写你的accessKey和secretKey
    accessKey: 'minio accessKey, 通过控制台获取, 访问 ip:9090',
    secretKey: 'minio accessKey, 通过控制台获取, 访问 ip:9090'
  })
​
  // 开始上传图片
  const metaData = {}
  const tasks = imageList.map(image => {
    return new Promise(async (resolve, reject) => {
      try {
        // 图片重命名,这里采用最简单的,可以根据自己需求重新实现
        const name = `${Date.now()}${path.extname(image)}`
        // 具体请看Minio的API文档,这里是将图片上传到blog这个bucket上
        const res = await minioClient.fPutObject('自己创建一个 bucket', name, image, metaData)
        resolve(name)
      } catch (err) {
        reject(err)
      }
    })
  })
​
  const result = await Promise.all(tasks)
​
  // 返回图片的访问链接
  result.forEach(name => {
    const url = `http://{ip:9000}/{自己创建的 bucket}/${name}`
    // Typora会提取脚本的输出作为地址,将markdown上图片链接替换掉
    console.log(url)
  })
}
​
// 执行脚本
uploadImageFile(parseArgv())
​

下载 minio sdk

# 导航到 path/scripts/typora_upload_image.js 目录下
> npm install minio# 自动生成 pakage-lock.json  和 node_modules 文件夹

配置 typora

编写自定义命令,使用 node 脚本上传

typora -> 偏好设置 -> 图像 -> 上传服务器设定 -> 上传服务:自定义命令 -> node path/scripts/typora_upload_image.js

image-20221213215019972

上传图片

粘贴图片,选择上传图片,即可完成上传,获取远程 MinIO 返回的地址

image-20221213215205768