file upload and store

This commit is contained in:
Takeshi Kimata
2024-03-16 21:43:30 +09:00
parent afb58585fa
commit f73060b4ad
5 changed files with 329 additions and 1 deletions

View File

@@ -0,0 +1,70 @@
const express = require("express");
const router = express.Router();
const path = require("path");
const fs = require("fs");
const multer = require("multer");
const defineAttachment = require("../../models/attachments");
const { DataTypes } = require("sequelize");
module.exports = function (sequelize) {
const Attachment = defineAttachment(sequelize, DataTypes);
// Create uploads folder if it does not exist
const uploadDir = path.join(__dirname, "../../public/uploads");
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir, { recursive: true });
}
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, uploadDir);
},
filename: async (req, file, cb) => {
const ext = path.extname(file.originalname);
const baseName = path.basename(file.originalname, ext);
let fileName = `${baseName}${ext}`;
// Check if a file with the same name already exists
let fileExists = true;
let fileIndex = 1;
while (fileExists) {
const filePath = path.join(uploadDir, fileName);
if (fs.existsSync(filePath)) {
// If a file with the same name exists, add an index and rename the file
fileName = `${baseName}_${fileIndex}${ext}`;
fileIndex++;
} else {
fileExists = false;
}
}
cb(null, fileName);
},
});
const upload = multer({ storage });
router.post("/", upload.array("files", 10), async (req, res) => {
try {
const files = req.files;
if (files.length === 0) {
return res.status(400).json({ error: "No files uploaded" });
}
const host = req.get("host");
const protocol = req.protocol;
const attachmentsData = files.map((file) => ({
title: file.originalname,
path: `${protocol}://${host}/uploads/${file.filename}`,
}));
const newAttachments = await Attachment.bulkCreate(attachmentsData);
res.json(newAttachments);
} catch (error) {
res.status(500).json({ error: "Internal server error" });
}
});
return router;
};