Files
waooplus/scripts/test-minio.ts
2026-03-08 17:10:06 +08:00

120 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* MinIO 存储测试脚本
* 运行: npx tsx scripts/test-minio.ts
*/
import { config } from 'dotenv'
config() // 加载 .env 文件
import { getStorageProvider, uploadObject, getSignedObjectUrl, getObjectBuffer, deleteObject } from '../src/lib/storage'
import { randomUUID } from 'crypto'
async function testMinio() {
console.log('🧪 开始测试 MinIO 存储...\n')
// 1. 检查环境变量
console.log('1⃣ 检查环境变量:')
const requiredEnv = [
'STORAGE_TYPE',
'MINIO_ENDPOINT',
'MINIO_ACCESS_KEY',
'MINIO_SECRET_KEY',
'MINIO_BUCKET',
]
for (const key of requiredEnv) {
const value = process.env[key]
if (value) {
// 隐藏敏感信息
const displayValue = key.includes('SECRET') || key.includes('KEY') && key !== 'STORAGE_TYPE'
? '*'.repeat(Math.min(value.length, 8))
: value
console.log(`${key}=${displayValue}`)
} else {
console.log(`${key}=未设置`)
}
}
// 2. 初始化 Provider
console.log('\n2⃣ 初始化存储 Provider:')
try {
const provider = getStorageProvider()
console.log(` ✅ Provider 类型: ${provider.kind}`)
} catch (error) {
console.log(` ❌ 初始化失败:`, error)
process.exit(1)
}
// 3. 测试上传
console.log('\n3⃣ 测试上传:')
const testKey = `test/${randomUUID()}.txt`
const testContent = `Hello MinIO! 测试时间: ${new Date().toISOString()}`
let uploadedKey: string
try {
uploadedKey = await uploadObject(Buffer.from(testContent), testKey)
console.log(` ✅ 上传成功: ${uploadedKey}`)
} catch (error) {
console.log(` ❌ 上传失败:`, error)
process.exit(1)
}
// 4. 测试获取签名 URL
console.log('\n4⃣ 测试获取签名 URL:')
let signedUrl: string
try {
signedUrl = await getSignedObjectUrl(uploadedKey, 300)
console.log(` ✅ 签名 URL 生成成功`)
console.log(` URL: ${signedUrl.substring(0, 100)}...`)
} catch (error) {
console.log(` ❌ 签名 URL 生成失败:`, error)
process.exit(1)
}
// 5. 测试下载
console.log('\n5⃣ 测试下载:')
try {
const buffer = await getObjectBuffer(uploadedKey)
const content = buffer.toString()
if (content === testContent) {
console.log(` ✅ 下载成功,内容匹配`)
} else {
console.log(` ❌ 下载成功,但内容不匹配`)
console.log(` 预期: ${testContent}`)
console.log(` 实际: ${content}`)
}
} catch (error) {
console.log(` ❌ 下载失败:`, error)
process.exit(1)
}
// 6. 通过 HTTP 访问签名 URL
console.log('\n6⃣ 测试通过 HTTP 访问签名 URL:')
try {
const response = await fetch(signedUrl)
if (response.ok) {
const content = await response.text()
if (content === testContent) {
console.log(` ✅ HTTP 访问成功,内容匹配`)
} else {
console.log(` ❌ HTTP 访问成功,但内容不匹配`)
}
} else {
console.log(` ❌ HTTP 访问失败: ${response.status} ${response.statusText}`)
}
} catch (error) {
console.log(` ❌ HTTP 请求失败:`, error)
}
// 7. 清理测试文件
console.log('\n7⃣ 清理测试文件:')
try {
await deleteObject(uploadedKey)
console.log(` ✅ 删除成功`)
} catch (error) {
console.log(` ❌ 删除失败:`, error)
}
console.log('\n✨ 测试完成!')
}
testMinio().catch(console.error)