GET http://api.qiniu.com/v2/query?ak=hfWg1ocJzp6csQFOdiEOUV5EfZYQCC0StwmkGVS6&bucket=cloud-common 631 (status code 631)
response: {"error":"no such bucket"}
cloud-common存储桶不上传到云存储,直接将图片转为base64传给AI
优势:
文件: stage-requirements.component.ts
修改前(使用云存储上传):
// 上传到云存储
const storage = await NovaStorage.withCid(cid);
const uploadedFile = await storage.upload(file, {
prefixKey: `ai-design-analysis/${this.projectId}`,
onProgress: (progress) => { /* ... */ }
});
// 保存URL
this.aiDesignUploadedImages.push(uploadedFile.url);
修改后(直接转base64):
// 🔥 关键修复:直接转base64,不上传到云存储
console.log(`🔄 将图片转换为base64格式...`);
// 使用FileReader转换为base64
const base64 = await new Promise<string>((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
const result = reader.result as string;
resolve(result);
};
reader.onerror = () => {
reject(new Error('文件读取失败'));
};
reader.readAsDataURL(file);
});
console.log(`✅ 图片已转换为base64,大小: ${(base64.length / 1024).toFixed(2)}KB`);
// 🔥 保存base64数据(AI分析时使用)
this.aiDesignUploadedImages.push(base64);
this.aiDesignUploadedFiles.push({
url: base64, // base64字符串
name: file.name,
type: file.type,
size: file.size,
extension: fileExt,
isBase64: true // 标记为base64数据
});
修改前(只支持HTTP/HTTPS URL):
const validImages = this.aiDesignUploadedImages.filter(url => {
const isValid = url && (url.startsWith('http://') || url.startsWith('https://'));
return isValid;
});
修改后(支持base64格式):
// 🔥 关键检查:验证图片是否有效(支持HTTP/HTTPS URL 和 base64格式)
const validImages = this.aiDesignUploadedImages.filter(data => {
// 支持两种格式:1) HTTP/HTTPS URL 2) base64 (data:image/...)
const isValidUrl = data && (data.startsWith('http://') || data.startsWith('https://'));
const isValidBase64 = data && data.startsWith('data:image/');
const isValid = isValidUrl || isValidBase64;
return isValid;
});
console.log('✅ 验证通过,有效图片数量:', validImages.length);
console.log('📸 图片格式:', validImages.map(img => img.startsWith('data:') ? 'base64' : 'URL'));
修改点:
只支持图片格式(移除PDF、CAD、Office等)
// 🔥 只支持图片格式进行AI分析
const supportedImageTypes = [
'image/jpeg', 'image/jpg', 'image/png', 'image/gif',
'image/webp', 'image/bmp', 'image/tiff'
];
if (file.size > 10 * 1024 * 1024) {
window?.fmode?.alert(`文件超过10MB限制: ${file.name}\n建议压缩后再上传`);
continue;
}
用户选择图片
↓
上传到七牛云 (cloud-common桶) ❌ 631错误
↓
无法获取URL
↓
AI分析失败
用户选择图片
↓
FileReader读取文件
↓
转换为base64 (data:image/jpeg;base64,...)
↓
保存到内存 (aiDesignUploadedImages)
↓
直接传给AI分析 ✅
↓
AI返回分析结果
📤 准备处理文件: 客厅效果图.jpg, 大小: 2.5MB
🔄 将图片转换为base64格式...
✅ 图片已转换为base64,大小: 3333.33KB
💾 已保存图片: 客厅效果图.jpg
✅ 已处理1个文件
🎯 所有图片已转为base64,可直接进行AI分析
🤖 开始AI图片分析...
📸 图片数量: 1
📸 图片格式: [ 'base64' ]
✅ 验证通过,有效图片数量: 1
📤 发送给AI的提示词: ...
📤 图片URL: [ 'data:image/jpeg;base64,/9j/4AAQ...' ]
✅ AI分析完成,返回JSON对象: { spaceType: '客餐厅一体化', ... }
📤 准备处理文件: 高清大图.png, 大小: 15.2MB
❌ 文件超过10MB限制,跳过
🚨 文件超过10MB限制: 高清大图.png
建议压缩后再上传
1. 打开确认需求阶段
2. 点击"上传参考图片"或拖拽图片到区域
3. 验证控制台日志:
- ✅ 看到"图片已转换为base64"
- ✅ 看到"已保存图片"
- ❌ 不应该看到631错误
1. 上传图片后点击"开始AI分析"
2. 验证控制台日志:
- ✅ 看到"图片格式: ['base64']"
- ✅ 看到"发送给AI的提示词"
- ✅ 看到"AI分析完成"
- ✅ 拖拽JPG图片 → 成功
- ✅ 拖拽PNG图片 → 成功
- ✅ 拖拽GIF图片 → 成功
- ✅ 拖拽WebP图片 → 成功
// 可选:超过5MB自动压缩
if (file.size > 5 * 1024 * 1024) {
file = await compressImage(file, { maxWidth: 2048, quality: 0.8 });
}
// 可选:缓存已分析的图片结果
const cacheKey = await hashFile(file);
if (this.analysisCache.has(cacheKey)) {
return this.analysisCache.get(cacheKey);
}
// 可选:后台异步上传(不阻塞AI分析)
this.uploadToCloudAsync(base64, file.name).then(url => {
console.log('后台上传成功:', url);
// 更新ProjectFile记录
});
修复时间: 2024-12-01 修复人员: Cascade AI 测试状态: ✅ 待验证 关键问题: 631错误 - "no such bucket" 解决方案: Base64直传方案