用快捷指令上传图片到七牛云

Tip

分享一个我在用的七牛云图床上传方案,通过Scriptable和快捷指令实现。

1 背景

写博客的时候经常需要上传图片获取链接,每次都要打开网页上传比较麻烦。所以写了这个脚本,配合快捷指令可以直接在手机上传图片到七牛云,自动复制链接到剪贴板。

主要用途:

  • 博客写作时快速获取图片链接
  • 在手机上编辑Markdown文档
  • 分享图片时需要外链

2 准备工作

2.1 安装Scriptable

Scriptable是iOS上的JavaScript自动化工具,可以和快捷指令配合使用。在App Store搜索下载即可。

2.2 配置七牛云

七牛云的配置步骤:

  1. 注册账号:前往七牛云官网注册(需要实名认证)

  2. 创建存储空间

    • 登录控制台 → 对象存储 → 新建存储空间
    • 选择公开空间(图床需要外链访问)
    • 区域选择离你最近的(华东/华北/华南)
  3. 获取必要信息

    • AccessKey/SecretKey:个人中心 → 密钥管理
    • 存储空间名称:你创建的Bucket名称
    • 域名:存储空间 → 域名管理(可使用测试域名)
  4. 生成上传Token(重要):

    # 可以使用在线工具生成:https://tool.lu/qiniu/
    # 或使用七牛云SDK生成(推荐)
Warning

Token有有效期限制,过期需要重新生成。建议使用服务端生成Token或定期更新。

3 脚本实现

下面是完整的Scriptable脚本,它实现了图片上传到七牛云的核心功能:

// 七牛云配置
qiniu_api = "http://up-z2.qiniup.com"; // 华东区域上传地址
cdn_url = ""; // 你的CDN域名,如 https://cdn.example.com/
token = ""; // 七牛云上传凭证
// 获取图片
let imgFile = "";
if (args.images.length <= 0) {
// 如果没有传入图片,从相册选择
imgFile = await Photos.fromLibrary();
} else {
// 使用传入的第一张图片
imgFile = args.images[0];
}
// 生成唯一文件名
let df = new DateFormatter();
df.dateFormat = "yyyyMMddHHmmSSS";
let dateString = df.string(new Date());
console.log(dateString);
// 构建上传请求
let req = new Request(qiniu_api);
req.method = "POST";
req.headers = { "content-type": "multipart/form-data" };
req.addParameterToMultipart("key", "image/" + dateString + ".png"); // 文件在七牛云的路径
req.addParameterToMultipart("token", token); // 上传凭证
req.addParameterToMultipart("fileName", "reqFileName"); // 文件名参数
req.addImageToMultipart(imgFile, "file", "FN"); // 添加图片文件
// 执行上传并处理结果
let result = await req.loadJSON();
let resultString = cdn_url + result["key"];
let mdString = "![" + result["key"] + "](" + resultString + "-small.webp)"; // 生成Markdown格式
console.log(mdString);
Pasteboard.copyString(mdString); // 复制到剪贴板
Script.complete(); // 结束脚本

代码说明

脚本的主要逻辑:

  1. 获取图片:如果快捷指令传入了图片就用传入的,否则从相册选择

  2. 生成文件名:用时间戳生成唯一文件名,避免冲突

  3. 上传到七牛云:构造multipart/form-data请求,包含key、token等参数

  4. 返回链接:拼接CDN域名和文件路径,生成Markdown格式链接并复制到剪贴板

4 一些补充

关于Token

七牛云的上传Token有时效限制,这个脚本里直接写死了Token,实际使用时需要注意更新。更好的方案是搭建一个服务端动态生成Token。

图片处理

七牛云支持在URL后面加参数来处理图片,比如:

  • 转WebP格式:?imageView2/format/webp
  • 压缩质量:?imageView2/quality/80
  • 调整大小:?imageView2/thumbnail/500x500

我在脚本里加了-small.webp后缀,实际使用时可以根据需要调整。

其他说明

  • 这个脚本只支持单张图片上传,如果需要批量上传需要改造
  • 七牛云的免费额度每个账号不同,具体以官网为准
  • 如果域名访问有问题,可能需要备案或使用其他CDN