/** * 测试腾讯云 COS S3 上传功能 - 详细版 */ import { S3Client, PutObjectCommand, ListBucketsCommand, HeadBucketCommand, GetBucketLocationCommand } from '@aws-sdk/client-s3'; // 腾讯云 COS 配置 const config = { endpoint: 'https://cos.ap-guangzhou.myqcloud.com', accessKeyId: 'AKIDseDYiiV4PYUCgMr9E5i9QUZYN2UlqiSy', secretAccessKey: 'PbaMxLWTBj5D8sV7dv1tXxCEZjgQwEJO', bucket: '6k6g-1325367676', publicDomain: 'https://assets.5e1.com' }; // 从 endpoint 解析 region const match = config.endpoint.match(/cos\.(.*?)\.myqcloud\.com/); const region = match ? match[1] : 'ap-guangzhou'; console.log('[Test] COS Config:'); console.log(` Endpoint: ${config.endpoint}`); console.log(` Region: ${region}`); console.log(` Bucket: ${config.bucket}`); console.log(` AccessKeyId: ${config.accessKeyId.slice(0, 8)}...`); async function testCOS() { // 测试1: 不使用 endpoint,直接用 region(腾讯云推荐方式) console.log('\n=== 测试 1: 标准 S3 配置 (无 endpoint) ==='); const client1 = new S3Client({ region, credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey, }, // 不设置 endpoint,让 SDK 自动构建 }); try { const result = await client1.send(new ListBucketsCommand({})); console.log('[Test] ✅ ListBuckets 成功!'); console.log('[Test] Buckets:', result.Buckets?.map(b => b.Name).join(', ') || 'none'); } catch (err: any) { console.error('[Test] ❌ ListBuckets 失败:', err.message); console.error('[Test] Code:', err.Code || err.name); console.error('[Test] RequestId:', err.RequestId || 'N/A'); } // 测试2: 使用 endpoint + forcePathStyle console.log('\n=== 测试 2: Path-style URL (腾讯云推荐) ==='); const client2 = new S3Client({ region, endpoint: config.endpoint, credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey, }, forcePathStyle: true, }); try { await client2.send(new HeadBucketCommand({ Bucket: config.bucket })); console.log('[Test] ✅ HeadBucket 成功! Bucket 存在'); } catch (err: any) { console.error('[Test] ❌ HeadBucket 失败:', err.message); console.error('[Test] Code:', err.Code || err.name); console.error('[Test] RequestId:', err.RequestId || 'N/A'); console.error('[Test] StatusCode:', err.$metadata?.httpStatusCode); // 打印完整错误对象 console.error('[Test] Full error:', JSON.stringify(err, null, 2).slice(0, 500)); } // 测试3: 直接上传 console.log('\n=== 测试 3: 直接上传测试文件 ==='); const testKey = `test/cos-test-${Date.now()}.txt`; const testContent = Buffer.from(`COS Upload Test - ${new Date().toISOString()}`); try { const result = await client2.send(new PutObjectCommand({ Bucket: config.bucket, Key: testKey, Body: testContent, ContentType: 'text/plain', })); console.log('[Test] ✅ PutObject 成功!'); console.log('[Test] ETag:', result.ETag); console.log('[Test] URL: ${config.publicDomain}/${testKey}'); } catch (err: any) { console.error('[Test] ❌ PutObject 失败:', err.message); console.error('[Test] Code:', err.Code || err.name); console.error('[Test] RequestId:', err.RequestId || 'N/A'); console.error('[Test] StatusCode:', err.$metadata?.httpStatusCode); } } testCOS() .then(() => console.log('\n[Test] 测试完成')) .catch(err => { console.error('[Test] 测试异常:', err); process.exit(1); });