重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
tigris-object-operations by tigrisdata/skills
npx skills add https://github.com/tigrisdata/skills --skill tigris-object-operations在进行任何操作之前,如果尚未安装 Tigris CLI,请先安装:
tigris help || npm install -g @tigrisdata/cli
如果需要安装,请告知用户:“我正在安装 Tigris CLI (@tigrisdata/cli),以便我们可以使用 Tigris 对象存储。”
Tigris 存储提供对象操作:上传(put)、下载(get)、删除(remove)、列表(list)、元数据(head)和预签名 URL。
所有方法都返回 TigrisStorageResponse<T, E> - 请先检查 error 属性。
| 操作 | 函数 | 关键参数 |
|---|---|---|
| 上传 | put(path, body, options) |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| path, body, access, contentType |
| 下载 | get(path, format, options) | path, format (string/file/stream) |
| 删除 | remove(path, options) | path |
| 列表 | list(options) | prefix, limit, paginationToken |
| 元数据 | head(path, options) | path |
| 预签名 URL | getPresignedUrl(path, options) | path, operation (get/put) |
import { put } from "@tigrisdata/storage";
// 简单上传
const result = await put("simple.txt", "Hello, World!");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Uploaded:", result.data?.url);
}
// 大文件上传,带进度
const result = await put("large.mp4", fileStream, {
multipart: true,
onUploadProgress: ({ loaded, total, percentage }) => {
console.log(`${loaded}/${total} bytes (${percentage}%)`);
},
});
// 防止覆盖
const result = await put("config.json", config, {
allowOverwrite: false,
});
| 选项 | 值 | 默认值 | 用途 |
|---|---|---|---|
| access | public/private | - | 对象可见性 |
| addRandomSuffix | boolean | false | 避免命名冲突 |
| allowOverwrite | boolean | true | 允许替换现有对象 |
| contentType | string | inferred | MIME 类型 |
| contentDisposition | inline/attachment | inline | 下载行为 |
| multipart | boolean | false | 为大文件启用 |
| onUploadProgress | callback | - | 跟踪上传进度 |
import { get } from "@tigrisdata/storage";
// 以字符串形式获取
const result = await get("object.txt", "string");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Content:", result.data);
}
// 以文件形式获取(在浏览器中触发下载)
const result = await get("object.pdf", "file", {
contentDisposition: "attachment",
});
// 以流形式获取
const result = await get("video.mp4", "stream");
const reader = result.data?.getReader();
// 处理流...
| 选项 | 值 | 默认值 | 用途 |
|---|---|---|---|
| contentDisposition | inline/attachment | inline | 下载行为 |
| contentType | string | from upload | MIME 类型 |
| encoding | string | utf-8 | 文本编码 |
| snapshotVersion | string | - | 从快照读取 |
import { remove } from "@tigrisdata/storage";
const result = await remove("object.txt");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Deleted successfully");
}
import { list } from "@tigrisdata/storage";
// 列出所有对象
const result = await list();
console.log("Objects:", result.data?.items);
// 按前缀列出(文件夹)
const result = await list({ prefix: "images/" });
// 分页列出
const allFiles = [];
let currentPage = await list({ limit: 10 });
allFiles.push(...currentPage.data?.items);
while (currentPage.data?.hasMore) {
currentPage = await list({
limit: 10,
paginationToken: currentPage.data?.paginationToken,
});
allFiles.push(...currentPage.data?.items);
}
| 选项 | 用途 |
|---|---|
| prefix | 过滤以指定前缀开头的键 |
| delimiter | 分组键(例如,'/' 用于文件夹) |
| limit | 返回的最大对象数(默认值:100) |
| paginationToken | 从上次列表继续 |
| snapshotVersion | 从快照列出 |
import { head } from "@tigrisdata/storage";
const result = await head("object.txt");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Metadata:", result.data);
// { path, size, contentType, modified, url, contentDisposition }
}
import { getPresignedUrl } from "@tigrisdata/storage";
// 用于 GET 的预签名 URL(临时访问)
const result = await getPresignedUrl("object.txt", {
operation: "get",
expiresIn: 3600, // 1 小时
});
console.log("URL:", result.data?.url);
// 用于 PUT 的预签名 URL(允许客户端上传)
const result = await getPresignedUrl("upload.txt", {
operation: "put",
expiresIn: 600, // 10 分钟
});
| 选项 | 值 | 默认值 | 用途 |
|---|---|---|---|
| operation | get/put | - | URL 用途 |
| expiresIn | 秒 | 3600 | URL 过期时间 |
| contentType | string | - | PUT 操作所需 |
| 错误 | 修复方法 |
|---|---|
未先检查 error | 在使用 result.data 之前始终检查 if (result.error) |
get() 中使用了错误的格式 | 使用 'string'、'file' 或 'stream' |
忘记设置 multipart: true | 对于大于 100MB 的文件启用 |
| 忽略分页 | 使用 hasMore 和 paginationToken |
对于浏览器上传,请使用客户端包直接上传到 Tigris:
import { upload } from "@tigrisdata/storage/client";
const result = await upload(file.name, file, {
url: "/api/upload", // 您的后端端点
onUploadProgress: ({ percentage }) => {
console.log(`${percentage}%`);
},
});
有关初始设置,请参阅 file-storage。
每周安装次数
44
代码仓库
GitHub 星标数
2
首次出现
2026 年 1 月 23 日
安全审计
安装于
codex42
opencode42
gemini-cli41
claude-code40
github-copilot39
cursor38
Before doing anything else , install the Tigris CLI if it's not already available:
tigris help || npm install -g @tigrisdata/cli
If you need to install it, tell the user: "I'm installing the Tigris CLI (@tigrisdata/cli) so we can work with Tigris object storage."
Tigris Storage provides object operations: upload (put), download (get), delete (remove), list, metadata (head), and presigned URLs.
All methods return TigrisStorageResponse<T, E> - check error property first.
| Operation | Function | Key Parameters |
|---|---|---|
| Upload | put(path, body, options) | path, body, access, contentType |
| Download | get(path, format, options) | path, format (string/file/stream) |
| Delete | remove(path, options) | path |
| List | list(options) | prefix, limit, paginationToken |
| Metadata | head(path, options) | path |
| Presigned URL | getPresignedUrl(path, options) | path, operation (get/put) |
import { put } from "@tigrisdata/storage";
// Simple upload
const result = await put("simple.txt", "Hello, World!");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Uploaded:", result.data?.url);
}
// Large file with progress
const result = await put("large.mp4", fileStream, {
multipart: true,
onUploadProgress: ({ loaded, total, percentage }) => {
console.log(`${loaded}/${total} bytes (${percentage}%)`);
},
});
// Prevent overwrite
const result = await put("config.json", config, {
allowOverwrite: false,
});
| Option | Values | Default | Purpose |
|---|---|---|---|
| access | public/private | - | Object visibility |
| addRandomSuffix | boolean | false | Avoid naming collisions |
| allowOverwrite | boolean | true | Allow replacing existing |
| contentType | string | inferred | MIME type |
| contentDisposition | inline/attachment | inline | Download behavior |
| multipart | boolean | false | Enable for large files |
| onUploadProgress | callback | - | Track upload progress |
import { get } from "@tigrisdata/storage";
// Get as string
const result = await get("object.txt", "string");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Content:", result.data);
}
// Get as file (triggers download in browser)
const result = await get("object.pdf", "file", {
contentDisposition: "attachment",
});
// Get as stream
const result = await get("video.mp4", "stream");
const reader = result.data?.getReader();
// Process stream...
| Option | Values | Default | Purpose |
|---|---|---|---|
| contentDisposition | inline/attachment | inline | Download behavior |
| contentType | string | from upload | MIME type |
| encoding | string | utf-8 | Text encoding |
| snapshotVersion | string | - | Read from snapshot |
import { remove } from "@tigrisdata/storage";
const result = await remove("object.txt");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Deleted successfully");
}
import { list } from "@tigrisdata/storage";
// List all objects
const result = await list();
console.log("Objects:", result.data?.items);
// List with prefix (folders)
const result = await list({ prefix: "images/" });
// List with pagination
const allFiles = [];
let currentPage = await list({ limit: 10 });
allFiles.push(...currentPage.data?.items);
while (currentPage.data?.hasMore) {
currentPage = await list({
limit: 10,
paginationToken: currentPage.data?.paginationToken,
});
allFiles.push(...currentPage.data?.items);
}
| Option | Purpose |
|---|---|
| prefix | Filter keys starting with prefix |
| delimiter | Group keys (e.g., '/' for folders) |
| limit | Max objects to return (default: 100) |
| paginationToken | Continue from previous list |
| snapshotVersion | List from snapshot |
import { head } from "@tigrisdata/storage";
const result = await head("object.txt");
if (result.error) {
console.error("Error:", result.error);
} else {
console.log("Metadata:", result.data);
// { path, size, contentType, modified, url, contentDisposition }
}
import { getPresignedUrl } from "@tigrisdata/storage";
// Presigned URL for GET (temporary access)
const result = await getPresignedUrl("object.txt", {
operation: "get",
expiresIn: 3600, // 1 hour
});
console.log("URL:", result.data?.url);
// Presigned URL for PUT (allow client upload)
const result = await getPresignedUrl("upload.txt", {
operation: "put",
expiresIn: 600, // 10 minutes
});
| Option | Values | Default | Purpose |
|---|---|---|---|
| operation | get/put | - | URL purpose |
| expiresIn | seconds | 3600 | URL expiration |
| contentType | string | - | Require for PUT |
| Mistake | Fix |
|---|---|
Not checking error first | Always check if (result.error) before result.data |
Wrong format in get() | Use 'string', 'file', or 'stream' |
Forgetting multipart: true | Enable for files >100MB |
| Ignoring pagination | Use hasMore and paginationToken |
For browser uploads, use the client package to upload directly to Tigris:
import { upload } from "@tigrisdata/storage/client";
const result = await upload(file.name, file, {
url: "/api/upload", // Your backend endpoint
onUploadProgress: ({ percentage }) => {
console.log(`${percentage}%`);
},
});
For initial setup, see file-storage.
Weekly Installs
44
Repository
GitHub Stars
2
First Seen
Jan 23, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex42
opencode42
gemini-cli41
claude-code40
github-copilot39
cursor38
Supabase Postgres 最佳实践指南 - 8大类别性能优化规则与SQL示例
89,100 周安装
Supabase 检测工具 - 快速识别 Web 应用后端是否为 Supabase | 安全审计必备
115 周安装
悖论寓言创作指南:如何通过叙事具象化智慧,创作保持张力的寓言故事
122 周安装
GDPR/CCPA隐私审计工具 - 自动化检测隐私政策与技术实现一致性,降低合规风险
113 周安装
Electron-egg 桌面应用开发框架:基于 Electron 和 Egg.js 的完整指南
44 周安装
CodeRecon代码侦察技能:深度架构分析与安全审计方法,快速理解陌生代码库
117 周安装
Salesforce开发专家指南:Apex、LWC、SOQL与元数据配置最佳实践
117 周安装