关于 integrate-asset-delivery-with-transloadit-smartcdn-in-nextjs
为 Next.js App Router 项目接入 Transloadit Smart CDN 签名 URL 的技能,说明服务端配置方式,并提供用于检查 URL 的示例页面。
主要功能
- 01在服务端签署 Smart CDN URL
- 02配置 workspace、template 和 input
- 03将 Transloadit 密钥保留在服务端
- 04添加可选演示页面
适用场景
- 01通过 Smart CDN 提供已配置的公开资源
- 02为获授权的私有资源返回短时有效 URL
- 03通过 Next.js 路由验证签名 URL
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ transloadit/ skills --skill integrate-asset-delivery-with-transloadit-smartcdn-in-nextjs安装后在 Claude Code 中输入/integrate-asset-delivery-with-transloadit-smartcdn-in-nextjs确认已加载。
详细介绍
输入
- 必需的环境变量(仅服务端):
TRANSLOADIT_KEY、TRANSLOADIT_SECRET、TRANSLOADIT_SMARTCDN_WORKSPACE、TRANSLOADIT_SMARTCDN_TEMPLATE和TRANSLOADIT_SMARTCDN_INPUT
本地开发时,将这些变量放入 .env.local。切勿将 TRANSLOADIT_SECRET 暴露给浏览器。
使用由 TRANSLOADIT_SMARTCDN_WORKSPACE 拥有的 Template,并为 TRANSLOADIT_SMARTCDN_INPUT 指定固定的资源或存储路径。不要使用接受任意源 URL 的共享 Template。如果工作区 Template 通过 HTTP 导入内容,请在 Template 中限制其源和路径,而不是接受请求中的任意 URL。
安装
npm i @transloadit/utils
实现(App Router)
选择根目录:
- 如果项目包含
src/app,请使用src/app/... - 否则使用
app/...
1) 服务端路由:为 Smart CDN URL 签名
创建 app/api/smartcdn/route.ts(如果使用 src/,则创建 src/app/api/smartcdn/route.ts):
import { NextResponse } from 'next/server'
import { getSignedSmartCdnUrl } from '@transloadit/utils/node'
export const runtime = 'nodejs'
function getRequiredEnv(name: string): string {
const value = process.env[name]
if (!value) throw new Error(`Missing required env var: ${name}`)
return value
}
export async function GET() {
try {
const authKey = getRequiredEnv('TRANSLOADIT_KEY')
const authSecret = getRequiredEnv('TRANSLOADIT_SECRET')
const workspace = getRequiredEnv('TRANSLOADIT_SMARTCDN_WORKSPACE')
const template = getRequiredEnv('TRANSLOADIT_SMARTCDN_TEMPLATE')
const input = getRequiredEnv('TRANSLOADIT_SMARTCDN_INPUT')
const url = getSignedSmartCdnUrl({ workspace, template, input, authKey, authSecret })
return NextResponse.json({ url, workspace, template, input })
} catch (err) {
const message = err instanceof Error ? err.message : 'Unknown error'
return NextResponse.json({ error: message }, { status: 500 })
}
}
此路由会为一个由服务端配置的公开资源签名。不要将 workspace、template 或 input 替换为未经检查的查询或请求体值。对于私有资源,在返回短时有效的 URL 之前,请先对调用方进行身份验证和授权。
2) 可选:简易演示页面
创建 app/smartcdn/page.tsx(或 src/app/smartcdn/page.tsx):
import SmartCdnDemo from './smartcdn-demo'
export default function SmartCdnPage() {
return (
<main style={{ padding: 24 }}>
<h1 style={{ fontSize: 20, fontWeight: 600 }}>Smart CDN Signed URL</h1>
<SmartCdnDemo />
</main>
)
}
创建 app/smartcdn/smartcdn-demo.tsx(或 src/app/smartcdn/smartcdn-demo.tsx):
'use client'
import { useEffect, useState } from 'react'
export default function SmartCdnDemo() {
const [payload, setPayload] = useState<unknown>(null)
useEffect(() => {
let cancelled = false
fetch('/api/smartcdn', { cache: 'no-store' })
.then(async (res) => res.json())
.then((json) => {
if (!cancelled) setPayload(json)
})
.catch((err) => {
if (!cancelled) setPayload({ error: String(err) })
})
return () => {
cancelled = true
}
}, [])
return (
<pre data-testid="smartcdn-json">
{payload ? JSON.stringify(payload, null, 2) : '(loading)'}
</pre>
)
}
快速检查
- 启动开发服务器,然后打开
/smartcdn或请求/api/smartcdn。 - 预期返回包含
url和已配置{ workspace, template, input }的 JSON。
参考资料(内部)
- 可用的参考实现:
https://github.com/transloadit/skills/tree/main/scenarios/integrate-asset-delivery-with-transloadit-smartcdn-in-nextjs
已使用以下版本测试(确切版本请参阅场景锁定文件):
- Next.js 16.1.6(App Router)
- React 19.2.3
- @transloadit/utils 4.3.0(Smart CDN 签名)