Files
trpic/web/scripts/upload/upload.js
Hubert Chen 30468714a1 refactor
sqlite WAL journal mode
refactor API endpoints
2026-07-06 23:42:41 +08:00

128 lines
3.6 KiB
JavaScript

document.addEventListener("DOMContentLoaded", () => {
if (document.cookie.includes("_trpic_user")) {
let infoBox = document.getElementById("info-box");
// 阻止默认行为
["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => {
infoBox.addEventListener(eventName, (e) => e.preventDefault());
});
// 拖入高亮
["dragenter", "dragover"].forEach((eventName) => {
infoBox.addEventListener(eventName, () => {
infoBox.className = "drag";
});
});
// 拖出取消高亮
["dragleave", "drop"].forEach((eventName) => {
infoBox.addEventListener(eventName, () => {
infoBox.className = "";
});
});
// 处理文件
infoBox.addEventListener("drop", (e) => {
const files = e.dataTransfer.files;
const link = e.dataTransfer.getData("text/plain");
let merge = false;
if (files.length > 0) {
if (files.length > 1) {
merge = confirm("选择了多张图片,要组合为一个作品上传吗?")
}
uploadFiles(files, merge);
} else if (link) {
uploadLink(link);
}
});
async function uploadFiles(files, merge) {
let artwork;
let index = 0;
for (const file of files) {
if (!merge || index == 0) {
try {
const formData = new FormData();
formData.append("file", file);
const res = await fetch("/api/artworks", { method: "POST", body: formData });
const data = await res.json();
switch (res.status) {
case 201:
artwork = data;
break;
case 401:
alert("上传失败:需要验证");
break;
default:
alert(`上传失败:${data.msg}: ${data.error}`);
return;
}
} catch (error) {
alert(`请求失败: ${error}`);
}
} else if (artwork) {
try {
const formData = new FormData();
formData.append("artwork_id", artwork.id);
formData.append("file", file);
const res = await fetch(`/api/files`, { method: "POST", body: formData })
const data = await res.json();
switch (res.status) {
case 201:
break;
case 401:
alert("上传失败:需要验证");
break;
default:
alert(`上传失败:${data.msg}: ${data.error}`);
return;
}
} catch (error) {
alert(`请求失败: ${error}`);
return;
}
}
index++;
}
infoBox.className = "uploaded";
setTimeout(() => {
infoBox.className = "";
resetGallery();
}, 1000);
}
async function uploadLink(link) {
try {
const formData = new FormData();
formData.append("link", link);
const res = await fetch("/api/artworks", { method: "POST", body: formData });
const data = await res.json();
switch (res.status) {
case 201:
artwork = data;
break;
case 401:
alert("上传失败:需要验证");
break;
default:
alert(`上传失败:${data.msg}: ${data.error}`);
return;
}
} catch (error) {
alert(`请求失败: ${error}`);
}
infoBox.className = "uploaded";
setTimeout(() => {
infoBox.className = "";
resetGallery();
}, 1000);
}
}
});