File size: 2,589 Bytes
d1ca8c8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | import express from "express";
import multer from "multer";
import dotenv from "dotenv";
dotenv.config();
const app = express();
const upload = multer({
storage: multer.memoryStorage(),
limits: {
fileSize: 100 * 1024 * 1024,
},
});
const PORT = process.env.PORT || 4001 || 4002;
const HF_TOKEN = process.env.HF_TOKEN;
const DEFAULT_DATASET_REPO = process.env.HUGGINGFACE_DATASET_REPO;
app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", process.env.CORS_ORIGIN || "*");
res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");
if (req.method === "OPTIONS") {
return res.sendStatus(200);
}
next();
});
if (!HF_TOKEN) {
console.error("Missing HF_TOKEN in environment. Set it in .env or process env.");
process.exit(1);
}
app.post("/upload", upload.single("file"), async (req, res) => {
try {
if (!req.file) {
return res.status(400).json({ error: "File is required (field name: file)." });
}
const datasetRepo = req.body.dataset || DEFAULT_DATASET_REPO;
if (!datasetRepo) {
return res.status(400).json({ error: "Dataset repository is required in request body or HUGGINGFACE_DATASET_REPO .env." });
}
const targetPath = req.body.path || req.file.originalname;
const url = `https://huggingface.co/api/datasets/${encodeURIComponent(datasetRepo)}/files/${encodeURIComponent(targetPath)}`;
const response = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${HF_TOKEN}`,
"Content-Type": req.file.mimetype || "application/octet-stream"
},
body: req.file.buffer
});
const result = await response.json();
if (!response.ok) {
return res.status(response.status).json({ error: result, url });
}
return res.status(200).json({ success: true, datasetRepo, path: targetPath, result });
} catch (error) {
console.error("Upload error:", error);
return res.status(500).json({ error: "Failed to upload file to Hugging Face dataset.", details: error.message });
}
});
app.use((error, req, res, next) => {
if (error instanceof multer.MulterError && error.code === "LIMIT_FILE_SIZE") {
return res.status(413).json({ error: "Ukuran file melebihi batas 100 MB." });
}
next(error);
});
app.get("/", (req, res) => {
res.json({ message: "Hugging Face dataset upload API is running.", uploadEndpoint: "/upload" });
});
app.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}`);
});
|