修复:在indexedDB中存储图像的原始base64数据而非Blob URL,以确保跨会话的持久性。

This commit is contained in:
2025-09-02 15:13:03 +08:00
parent febccfc863
commit 5a53c24886

View File

@@ -402,9 +402,15 @@ const indexedDBStorage = {
const transaction = this.db.transaction([CONFIG.INDEXED_DB.STORES.GENERATED_IMAGES], 'readwrite');
const store = transaction.objectStore(CONFIG.INDEXED_DB.STORES.GENERATED_IMAGES);
// 检查是否是Blob URL如果是则获取原始base64数据
let storedUrl = imageUrl;
if (imageUrl.startsWith('blob:') && imageUrl._originalBase64) {
storedUrl = imageUrl._originalBase64;
}
const image = {
imageId: imageId,
url: imageUrl,
url: storedUrl,
timestamp: Date.now()
};
@@ -708,7 +714,7 @@ const apiService = {
const messageContent = choice.message.content;
const images = [];
// 提取图像数据并转换为Blob URL
// 提取图像数据并转换为Blob URL但保留原始base64数据
if (choice.message.images) {
choice.message.images.forEach(img => {
const blobUrl = utils.base64ToBlobUrl(img.image_url.url);
@@ -814,7 +820,7 @@ const uiController = {
const imageId = Date.now() + Math.random();
// 确保imageUrl是Blob URL
// 确保imageUrl是Blob URL用于显示但保存原始URL用于存储
const displayUrl = imageUrl.startsWith('blob:') ? imageUrl : utils.base64ToBlobUrl(imageUrl);
imageDiv.innerHTML = `
@@ -928,7 +934,7 @@ const uiController = {
placeholder.className = 'image-item fade-in';
placeholder.id = '';
// 确保imageUrl是Blob URL
// 确保imageUrl是Blob URL用于显示但保存原始URL用于存储
const displayUrl = imageUrl.startsWith('blob:') ? imageUrl : utils.base64ToBlobUrl(imageUrl);
placeholder.innerHTML = `
@@ -1050,8 +1056,9 @@ const uiController = {
// 找到当前图像在generatedImages中的索引
currentImageIndex = generatedImages.findIndex(img => img.url === imageUrl);
// 设置图像源
modalImage.src = imageUrl;
// 设置图像源 - 确保正确处理base64和Blob URL
const displayUrl = imageUrl.startsWith('blob:') ? imageUrl : utils.base64ToBlobUrl(imageUrl);
modalImage.src = displayUrl;
modalImage.onerror = function() {
utils.showNotification('图像加载失败', 'danger');
};
@@ -1280,7 +1287,11 @@ const uiController = {
const deleteButton = document.getElementById('viewerDeleteImage');
if (modalImage && generatedImages[currentImageIndex]) {
modalImage.src = generatedImages[currentImageIndex].url;
// 确保正确处理base64和Blob URL
const displayUrl = generatedImages[currentImageIndex].url.startsWith('blob:') ?
generatedImages[currentImageIndex].url :
utils.base64ToBlobUrl(generatedImages[currentImageIndex].url);
modalImage.src = displayUrl;
// 更新删除按钮对应的图像ID
if (deleteButton) {
@@ -1295,7 +1306,10 @@ const uiController = {
currentImageIndex = generatedImages.length - 1;
}
if (currentImageIndex >= 0 && currentImageIndex < generatedImages.length) {
modalImage.src = generatedImages[currentImageIndex].url;
const newDisplayUrl = generatedImages[currentImageIndex].url.startsWith('blob:') ?
generatedImages[currentImageIndex].url :
utils.base64ToBlobUrl(generatedImages[currentImageIndex].url);
modalImage.src = newDisplayUrl;
deleteButton.onclick = arguments.callee;
}
uiController.updateNavigationButtons();
@@ -1367,7 +1381,7 @@ const uiController = {
displayImagePreview: function(imageData) {
const preview = document.getElementById('imagePreview');
// 确保图像数据是Blob URL
// 确保图像数据是Blob URL用于显示,但保持原始数据用于其他操作
const displayUrl = imageData.data.startsWith('blob:') ? imageData.data : utils.base64ToBlobUrl(imageData.data);
preview.innerHTML = `
@@ -1494,8 +1508,11 @@ const uiController = {
const imageDiv = document.createElement('div');
imageDiv.className = 'image-item fade-in';
// 确保从IndexedDB加载的base64数据转换为Blob URL用于显示
const displayUrl = img.url.startsWith('blob:') ? img.url : utils.base64ToBlobUrl(img.url);
imageDiv.innerHTML = `
<img src="${img.url}" alt="Generated Image" loading="lazy" class="generated-image">
<img src="${displayUrl}" alt="Generated Image" loading="lazy" class="generated-image">
<div class="image-overlay">
<div class="btn-grid">
<div class="btn-grid-row">