智慧教务系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

128 lines
4.3 KiB

<?php
/**
* 腾讯云COS上传诊断脚本
* 用于诊断"The Signature you specified is invalid"错误
*/
require_once __DIR__ . '/vendor/autoload.php';
use Qcloud\Cos\Client;
// 从数据库获取配置
try {
$pdo = new PDO('mysql:host=niucloud_mysql;dbname=niucloud', 'niucloud', 'niucloud123');
$stmt = $pdo->prepare("SELECT value FROM school_sys_config WHERE config_key = 'STORAGE'");
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$result) {
die("❌ 未找到存储配置\n");
}
$storage_config = json_decode($result['value'], true);
if (!$storage_config || !isset($storage_config['tencent'])) {
die("❌ 腾讯云存储配置不存在\n");
}
$config = $storage_config['tencent'];
echo "📋 腾讯云COS配置检查\n";
echo "====================\n";
echo "Bucket: " . $config['bucket'] . "\n";
echo "Region: " . $config['region'] . "\n";
echo "Access Key: " . substr($config['access_key'], 0, 8) . "***\n";
echo "Secret Key: " . substr($config['secret_key'], 0, 8) . "***\n";
echo "Domain: " . $config['domain'] . "\n\n";
// 测试连接
echo "🔍 测试腾讯云COS连接...\n";
$client = new Client([
'region' => $config['region'],
'credentials' => [
'secretId' => $config['access_key'],
'secretKey' => $config['secret_key']
]
]);
// 测试获取存储桶信息
try {
$result = $client->headBucket([
'Bucket' => $config['bucket']
]);
echo "✅ 存储桶连接成功\n";
echo "存储桶信息: " . json_encode($result->toArray()) . "\n\n";
} catch (Exception $e) {
echo "❌ 存储桶连接失败: " . $e->getMessage() . "\n";
echo "错误代码: " . $e->getCode() . "\n";
// 分析常见错误
if (strpos($e->getMessage(), 'SignatureDoesNotMatch') !== false ||
strpos($e->getMessage(), 'The Signature you specified is invalid') !== false) {
echo "\n🔧 签名错误诊断:\n";
echo "1. 检查 Access Key 和 Secret Key 是否正确\n";
echo "2. 检查服务器时间是否同步(时间偏差不能超过15分钟)\n";
echo "3. 检查密钥是否有相应的权限\n";
echo "4. 检查区域配置是否正确\n";
}
if (strpos($e->getMessage(), 'NoSuchBucket') !== false) {
echo "\n🔧 存储桶不存在:\n";
echo "1. 检查存储桶名称是否正确\n";
echo "2. 检查存储桶是否在指定区域\n";
}
echo "\n";
}
// 测试服务器时间
echo "⏰ 服务器时间检查:\n";
echo "当前时间: " . date('Y-m-d H:i:s T') . "\n";
echo "UTC时间: " . gmdate('Y-m-d H:i:s T') . "\n";
echo "时间戳: " . time() . "\n\n";
// 测试简单上传
echo "📤 测试文件上传...\n";
try {
$test_content = "Test upload at " . date('Y-m-d H:i:s');
$test_key = 'test/upload_test_' . time() . '.txt';
$result = $client->putObject([
'Bucket' => $config['bucket'],
'Key' => $test_key,
'Body' => $test_content,
]);
echo "✅ 测试文件上传成功\n";
echo "文件路径: " . $test_key . "\n";
echo "ETag: " . $result['ETag'] . "\n";
// 清理测试文件
try {
$client->deleteObject([
'Bucket' => $config['bucket'],
'Key' => $test_key,
]);
echo "🗑️ 测试文件已清理\n";
} catch (Exception $e) {
echo "⚠️ 测试文件清理失败: " . $e->getMessage() . "\n";
}
} catch (Exception $e) {
echo "❌ 测试文件上传失败: " . $e->getMessage() . "\n";
echo "错误代码: " . $e->getCode() . "\n";
}
} catch (PDOException $e) {
die("❌ 数据库连接失败: " . $e->getMessage() . "\n");
} catch (Exception $e) {
die("❌ 发生错误: " . $e->getMessage() . "\n");
}
echo "\n🎯 诊断完成\n";
echo "如果仍有问题,请检查:\n";
echo "1. 腾讯云控制台中的密钥状态\n";
echo "2. 存储桶的权限设置\n";
echo "3. 网络连接是否正常\n";
echo "4. PHP扩展是否完整(curl, openssl等)\n";
?>