lookroot的个人空间

给Typora再写个图片上传插件

使用代码解决生活中的问题(一)
置顶推荐

插件

前几年我发过一次使用插件把Typora中的图片上传到自己的图床,因为其他软件都要占用一定的内存,所以我更偏向于使用脚本的方式,最近再次切换回Typora编辑器,之前的方式已经失效,结合这两年热火朝天的生成式AI,几分钟搞定一个新的插件。

首先打开设置里面的图片上传

image-20240910125006756

选择自定义命令,这时候点击验证上传选项可以发现他会执行你设置的命令并加上图片的详细地址,如下

oss-uploader "/Applications/Typora.app/Contents/Resources/TypeMark/assets/icon/icon_512x512.png" "/Applications/Typora.app/Contents/Resources/TypeMark/assets/icon/icon_256x256.png"

你只需要返回这种格式即可

图片1处理后地址
图片2处理后地址

因为很久没有使用php了,下面结合node和腾讯云来写个demo,其他技术栈和云厂商基本没差别。

把厂商给的上传代码复制下来,再向gpt提问如何解析node命令传递过来的文件路径,解析并上传,然后响应给用户,稍加整理得到以下代码

const fs = require('fs').promises;
const path = require('path');
const COS = require('cos-nodejs-sdk-v5');

const args = process.argv.slice(2);
// 通过 npm 安装 sdk npm install cos-nodejs-sdk-v5
// SECRETID 和 SECRETKEY 请登录 https://console.cloud.tencent.com/cam/capi 进行查看和管理
// nodejs 端可直接使用 CAM 密钥计算签名,建议用限制最小权限的子用户的 CAM 密钥
// 最小权限原则说明 https://cloud.tencent.com/document/product/436/38618

const cos = new COS({
    Domain: "file.lookroot.cn", //自定义域名
    SecretId: "", // 推荐使用环境变量获取;用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
    SecretKey: "", // 推荐使用环境变量获取;用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参考https://cloud.tencent.com/document/product/598/37140
});



function generateFileName(originUrl) {
    // 获取当前日期并格式化为 YYYYMMDD
    const now = new Date();
    const formattedDate = now.toLocaleDateString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    }).replace(/\//g, ''); // 将日期格式化为 YYYYMMDD 并去掉斜杠

    // 生成随机字符串
    const randomString = Math.random().toString(36).substring(2, 10); // 生成8位随机字符串

    // 组合文件名
    return `${formattedDate}/${randomString}${path.extname(originUrl)}`;

}

async function uploadFile(originUrl) {
    try {
        const file = await fs.readFile(originUrl)
        return new Promise((resolve, reject) => {
            cos.putObject({

                Bucket: 'blog-1257762240', // 必须
                Region: 'ap-shanghai',     // 存储桶所在地域,必须字段
                Key: `/doc/${generateFileName(originUrl)}`,              // 必须
                StorageClass: 'STANDARD',
                Body: file, // 上传文件对象
                onProgress: (progressData) => {

                }
            }, (err, data) => {
                if (err) {
                    reject(err)
                } else {
                    resolve(data.Location)
                }
            });
        })
    } catch (err) {
        console.error('Error reading file:', err);
    }
}
Promise.all(args.map(filePath => uploadFile(filePath)))
    .then((res) => {
        console.log(res.join("\n"));
    }).catch(err => {
        console.error('Error upload file:', err);
    })

package.json

{
  "name": "typora-img-cli",
  "version": "1.0.0",
  "description": "typora upload img to oss",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "lookroot",
  "license": "ISC",
  "dependencies": {
    "cos-nodejs-sdk-v5": "^2.14.6"
  }
}

此时我们把这个命令配置到typora里面测试,即可通过

node /Users/lookroot/development/web/tool/typora/index.js "/Applications/Typora.app/Contents/Resources/TypeMark/assets/icon/icon_512x512.png" "/Applications/Typora.app/Contents/Resources/TypeMark/assets/icon/icon_256x256.png"
×
到此一游
留言
回到顶部

Loading...