anything-llm/server/utils/files/multer.js
timothycarambat 75ced7e65a merge with master
Patch LLM selection for native to be disabled
2024-04-07 14:55:18 -07:00

125 lines
3.6 KiB
JavaScript

const multer = require("multer");
const path = require("path");
const fs = require("fs");
const { v4 } = require("uuid");
// When on Render/Railway we ask the user to attach a volume that is
// mounted to the root. So under this specific circumstance reaching the collectors
// hot directory via path.resolve(process.env.STORAGE_DIR, `../../collector/hotdir`) will
// be out of bounds and the `hotdir` is always inside of the collector folder. It is not mounted
// with the rest of the storage.
// This line is only relevant for Render/Railway.
const RENDER_STORAGE = path.resolve(__dirname, `../../../collector/hotdir`);
// Handle File uploads for auto-uploading.
const fileUploadStorage = multer.diskStorage({
destination: function (_, __, cb) {
const uploadOutput = RENDER_STORAGE;
// process.env.NODE_ENV === "development"
// ? path.resolve(__dirname, `../../../collector/hotdir`)
// : path.resolve(process.env.STORAGE_DIR, `../../collector/hotdir`);
cb(null, uploadOutput);
},
filename: function (_, file, cb) {
file.originalname = Buffer.from(file.originalname, "latin1").toString(
"utf8"
);
cb(null, file.originalname);
},
});
// Asset storage for logos
const assetUploadStorage = multer.diskStorage({
destination: function (_, __, cb) {
const uploadOutput =
process.env.NODE_ENV === "development"
? path.resolve(__dirname, `../../storage/assets`)
: path.resolve(process.env.STORAGE_DIR, "assets");
fs.mkdirSync(uploadOutput, { recursive: true });
return cb(null, uploadOutput);
},
filename: function (_, file, cb) {
file.originalname = Buffer.from(file.originalname, "latin1").toString(
"utf8"
);
cb(null, file.originalname);
},
});
// Asset sub-storage manager for pfp icons.
const pfpUploadStorage = multer.diskStorage({
destination: function (_, __, cb) {
const uploadOutput =
process.env.NODE_ENV === "development"
? path.resolve(__dirname, `../../storage/assets/pfp`)
: path.resolve(process.env.STORAGE_DIR, "assets/pfp");
fs.mkdirSync(uploadOutput, { recursive: true });
return cb(null, uploadOutput);
},
filename: function (req, file, cb) {
const randomFileName = `${v4()}${path.extname(file.originalname)}`;
req.randomFileName = randomFileName;
cb(null, randomFileName);
},
});
// Handle Generic file upload as documents
function handleFileUpload(request, response, next) {
const upload = multer({ storage: fileUploadStorage }).single("file");
upload(request, response, function (err) {
if (err) {
response
.status(500)
.json({
success: false,
error: `Invalid file upload. ${err.message}`,
})
.end();
return;
}
next();
});
}
// Handle logo asset uploads
function handleAssetUpload(request, response, next) {
const upload = multer({ storage: assetUploadStorage }).single("logo");
upload(request, response, function (err) {
if (err) {
response
.status(500)
.json({
success: false,
error: `Invalid file upload. ${err.message}`,
})
.end();
return;
}
next();
});
}
// Handle PFP file upload as logos
function handlePfpUpload(request, response, next) {
const upload = multer({ storage: pfpUploadStorage }).single("file");
upload(request, response, function (err) {
if (err) {
response
.status(500)
.json({
success: false,
error: `Invalid file upload. ${err.message}`,
})
.end();
return;
}
next();
});
}
module.exports = {
handleFileUpload,
handleAssetUpload,
handlePfpUpload,
};