Upload index.html
Browse files- static/index.html +12 -24
static/index.html
CHANGED
|
@@ -5,7 +5,6 @@
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>Nano Banana Generator</title>
|
| 7 |
<style>
|
| 8 |
-
/* ... (保持原有样式不变) ... */
|
| 9 |
:root {
|
| 10 |
--bg-color: #0b0f19;
|
| 11 |
--card-color: #1a1f2e;
|
|
@@ -54,7 +53,7 @@
|
|
| 54 |
outline: none;
|
| 55 |
border-color: var(--accent-color);
|
| 56 |
}
|
| 57 |
-
|
| 58 |
/* --- 新增样式:图生图上传预览 --- */
|
| 59 |
.file-upload-wrapper {
|
| 60 |
position: relative;
|
|
@@ -77,7 +76,7 @@
|
|
| 77 |
.upload-placeholder { color: #a0aec0; pointer-events: none; }
|
| 78 |
|
| 79 |
.preview-container {
|
| 80 |
-
display: none;
|
| 81 |
margin-top: 10px;
|
| 82 |
position: relative;
|
| 83 |
width: fit-content;
|
|
@@ -105,7 +104,7 @@
|
|
| 105 |
padding: 0;
|
| 106 |
}
|
| 107 |
/* --------------------------------- */
|
| 108 |
-
|
| 109 |
button {
|
| 110 |
width: 100%;
|
| 111 |
padding: 12px;
|
|
@@ -300,10 +299,9 @@
|
|
| 300 |
</div>
|
| 301 |
|
| 302 |
<script>
|
| 303 |
-
// 全局变量存储初始图片的 Base64 数据
|
| 304 |
let initImageBase64 = null;
|
| 305 |
|
| 306 |
-
//
|
| 307 |
const fileInput = document.getElementById('init_image_input');
|
| 308 |
const previewContainer = document.getElementById('preview-container');
|
| 309 |
const previewImg = document.getElementById('preview-img');
|
|
@@ -312,38 +310,32 @@
|
|
| 312 |
fileInput.addEventListener('change', function(e) {
|
| 313 |
const file = e.target.files[0];
|
| 314 |
if (file) {
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
this.value = ''; // 清空选择
|
| 319 |
return;
|
| 320 |
}
|
| 321 |
|
| 322 |
const reader = new FileReader();
|
| 323 |
reader.onload = function(event) {
|
| 324 |
-
// 存储完整的 Data URL (包含 data:image/png;base64, 前缀)
|
| 325 |
initImageBase64 = event.target.result;
|
| 326 |
-
// 显示预览
|
| 327 |
previewImg.src = initImageBase64;
|
| 328 |
previewContainer.style.display = 'block';
|
| 329 |
-
uploadBox.style.display = 'none';
|
| 330 |
};
|
| 331 |
reader.readAsDataURL(file);
|
| 332 |
}
|
| 333 |
});
|
| 334 |
|
| 335 |
-
// --- 新增 JS:清除预览图片 ---
|
| 336 |
function clearImagePreview() {
|
| 337 |
-
fileInput.value = '';
|
| 338 |
-
initImageBase64 = null;
|
| 339 |
previewImg.src = '';
|
| 340 |
-
previewContainer.style.display = 'none';
|
| 341 |
-
uploadBox.style.display = 'block';
|
| 342 |
}
|
| 343 |
-
// ------------------------------------
|
| 344 |
|
| 345 |
function toggleSubmitButton() {
|
| 346 |
-
// ... (保持不变)
|
| 347 |
const checkbox = document.getElementById('agree_chk');
|
| 348 |
const btn = document.getElementById('gen-btn');
|
| 349 |
if (checkbox.checked) {
|
|
@@ -356,7 +348,6 @@
|
|
| 356 |
}
|
| 357 |
|
| 358 |
async function generateImage() {
|
| 359 |
-
// ... (前面部分保持不变)
|
| 360 |
const apiKey = document.getElementById('api_key').value;
|
| 361 |
const prompt = document.getElementById('prompt').value;
|
| 362 |
const checkbox = document.getElementById('agree_chk');
|
|
@@ -385,12 +376,10 @@
|
|
| 385 |
ratio: document.getElementById('ratio').value,
|
| 386 |
scale: document.getElementById('scale').value,
|
| 387 |
format: document.getElementById('format').value,
|
| 388 |
-
// --- 新增:如果有初始图片,加入 payload ---
|
| 389 |
init_image: initImageBase64
|
| 390 |
};
|
| 391 |
|
| 392 |
try {
|
| 393 |
-
// ... (API 请求部分保持不变)
|
| 394 |
const response = await fetch('/api/generate', {
|
| 395 |
method: 'POST',
|
| 396 |
headers: { 'Content-Type': 'application/json' },
|
|
@@ -416,7 +405,6 @@
|
|
| 416 |
statusText.innerText = "网络请求失败";
|
| 417 |
alert("网络请求失败,请检查控制台");
|
| 418 |
} finally {
|
| 419 |
-
// ... (清理工作保持不变)
|
| 420 |
if (document.getElementById('agree_chk').checked) {
|
| 421 |
btn.disabled = false;
|
| 422 |
btn.innerText = "🚀 开始生成";
|
|
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
<title>Nano Banana Generator</title>
|
| 7 |
<style>
|
|
|
|
| 8 |
:root {
|
| 9 |
--bg-color: #0b0f19;
|
| 10 |
--card-color: #1a1f2e;
|
|
|
|
| 53 |
outline: none;
|
| 54 |
border-color: var(--accent-color);
|
| 55 |
}
|
| 56 |
+
|
| 57 |
/* --- 新增样式:图生图上传预览 --- */
|
| 58 |
.file-upload-wrapper {
|
| 59 |
position: relative;
|
|
|
|
| 76 |
.upload-placeholder { color: #a0aec0; pointer-events: none; }
|
| 77 |
|
| 78 |
.preview-container {
|
| 79 |
+
display: none;
|
| 80 |
margin-top: 10px;
|
| 81 |
position: relative;
|
| 82 |
width: fit-content;
|
|
|
|
| 104 |
padding: 0;
|
| 105 |
}
|
| 106 |
/* --------------------------------- */
|
| 107 |
+
|
| 108 |
button {
|
| 109 |
width: 100%;
|
| 110 |
padding: 12px;
|
|
|
|
| 299 |
</div>
|
| 300 |
|
| 301 |
<script>
|
|
|
|
| 302 |
let initImageBase64 = null;
|
| 303 |
|
| 304 |
+
// 处理图片上传
|
| 305 |
const fileInput = document.getElementById('init_image_input');
|
| 306 |
const previewContainer = document.getElementById('preview-container');
|
| 307 |
const previewImg = document.getElementById('preview-img');
|
|
|
|
| 310 |
fileInput.addEventListener('change', function(e) {
|
| 311 |
const file = e.target.files[0];
|
| 312 |
if (file) {
|
| 313 |
+
if (file.size > 10 * 1024 * 1024) { // 稍微放宽前端限制,后端会压缩
|
| 314 |
+
alert("图片太大,请上传小于 10MB 的图片");
|
| 315 |
+
this.value = '';
|
|
|
|
| 316 |
return;
|
| 317 |
}
|
| 318 |
|
| 319 |
const reader = new FileReader();
|
| 320 |
reader.onload = function(event) {
|
|
|
|
| 321 |
initImageBase64 = event.target.result;
|
|
|
|
| 322 |
previewImg.src = initImageBase64;
|
| 323 |
previewContainer.style.display = 'block';
|
| 324 |
+
uploadBox.style.display = 'none';
|
| 325 |
};
|
| 326 |
reader.readAsDataURL(file);
|
| 327 |
}
|
| 328 |
});
|
| 329 |
|
|
|
|
| 330 |
function clearImagePreview() {
|
| 331 |
+
fileInput.value = '';
|
| 332 |
+
initImageBase64 = null;
|
| 333 |
previewImg.src = '';
|
| 334 |
+
previewContainer.style.display = 'none';
|
| 335 |
+
uploadBox.style.display = 'block';
|
| 336 |
}
|
|
|
|
| 337 |
|
| 338 |
function toggleSubmitButton() {
|
|
|
|
| 339 |
const checkbox = document.getElementById('agree_chk');
|
| 340 |
const btn = document.getElementById('gen-btn');
|
| 341 |
if (checkbox.checked) {
|
|
|
|
| 348 |
}
|
| 349 |
|
| 350 |
async function generateImage() {
|
|
|
|
| 351 |
const apiKey = document.getElementById('api_key').value;
|
| 352 |
const prompt = document.getElementById('prompt').value;
|
| 353 |
const checkbox = document.getElementById('agree_chk');
|
|
|
|
| 376 |
ratio: document.getElementById('ratio').value,
|
| 377 |
scale: document.getElementById('scale').value,
|
| 378 |
format: document.getElementById('format').value,
|
|
|
|
| 379 |
init_image: initImageBase64
|
| 380 |
};
|
| 381 |
|
| 382 |
try {
|
|
|
|
| 383 |
const response = await fetch('/api/generate', {
|
| 384 |
method: 'POST',
|
| 385 |
headers: { 'Content-Type': 'application/json' },
|
|
|
|
| 405 |
statusText.innerText = "网络请求失败";
|
| 406 |
alert("网络请求失败,请检查控制台");
|
| 407 |
} finally {
|
|
|
|
| 408 |
if (document.getElementById('agree_chk').checked) {
|
| 409 |
btn.disabled = false;
|
| 410 |
btn.innerText = "🚀 开始生成";
|