gen / routes /upload.js
AnesKAM's picture
Create routes/upload.js
06cb739 verified
Raw
History Blame Contribute Delete
2.42 kB
import express from "express";
import multer from "multer";
import mammoth from "mammoth";
import { MODEL_CAPS, MAX_FILE_BYTES } from "../lib/modelCaps.js";
const router = express.Router();
const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: MAX_FILE_BYTES } });
function extOf(name = "") { return (name.split(".").pop() || "").toLowerCase(); }
async function extractText(file) {
const ext = extOf(file.originalname);
if (["txt", "md", "csv", "json", "js", "ts", "py", "html", "css", "java", "c", "cpp"].includes(ext)) {
return file.buffer.toString("utf8");
}
if (ext === "docx") {
const { value } = await mammoth.extractRawText({ buffer: file.buffer });
return value;
}
if (ext === "pdf") {
// pdf-parse ุนุจุฑ import ุฏูŠู†ุงู…ูŠูƒูŠ (CJS)
const pdfParse = (await import("pdf-parse")).default;
const data = await pdfParse(file.buffer);
return data.text;
}
return "";
}
// POST /api/upload (multipart: file, model)
router.post("/upload", upload.single("file"), async (req, res) => {
try {
const model = (req.body.model || "flash").toLowerCase();
const caps = MODEL_CAPS[model] || MODEL_CAPS.flash;
const file = req.file;
if (!file) return res.status(400).json({ error: "no_file" });
const ext = extOf(file.originalname);
const isImage = file.mimetype.startsWith("image/");
// ุชุญู‚ู‚ ู…ู† ุฏุนู… ุงู„ู†ู…ูˆุฐุฌ ู„ู‡ุฐุง ุงู„ู†ูˆุน
if (isImage) {
if (!caps.vision || !caps.imageMimes.includes(file.mimetype)) {
return res.status(415).json({ error: "unsupported", message: `ุงู„ู†ู…ูˆุฐุฌ (${model}) ู„ุง ูŠุฏุนู… ุงู„ุตูˆุฑ.` });
}
const b64 = file.buffer.toString("base64");
return res.json({
kind: "image",
name: file.originalname,
dataUrl: `data:${file.mimetype};base64,${b64}`,
});
}
if (!caps.docExts.includes(ext)) {
return res.status(415).json({ error: "unsupported", message: `ุงู„ู†ู…ูˆุฐุฌ (${model}) ู„ุง ูŠุฏุนู… ู…ู„ูุงุช .${ext}` });
}
let text = await extractText(file);
if (text.length > 20000) text = text.slice(0, 20000) + "\n...[truncated]";
return res.json({ kind: "text", name: file.originalname, text });
} catch (err) {
console.error("upload error:", err);
res.status(500).json({ error: "upload_failed", message: String(err?.message || err) });
}
});
export default router;