import { connectToDb, fileExists } from"@/lib/mongodb";
import { NextResponse } from"next/server";
import { Readable } from"stream";
importformidable, { errorsasformidableErrors } from'formidable';
varfs=require('fs');
varmd5=require('md5');
exportconstconfig= {
api: {
bodyParser:false,
}
};
typeProcessedFiles= Array<[string, File]>;
exportdefaultasyncfunctionhandler(req:any, res:any) {
const { bucket } =awaitconnectToDb();
// get the form data
// const data = await req.formData();
// Access uploaded files directly using req.files
//const files = Array.from(req.files.entries());
letstatus=200,
resultBody= { status:'ok', message:'Files were uploaded successfully' };
constform=formidable({ uploadDir:"/tmp" });
letfields;
letfiles;
try {
form.parse(req, async (err, fields, files) => {
console.log('fields:', fields);
console.log('files:', files);
for (const [key, value] of Object.entries(files)) {
constisFile=typeofvalue=="object";
if (isFile) {
letfile:any=value[0]
letfilename=file.originalFilenamelettype=file.mimetypeletbuffer=fs.readFileSync(file.filepath);
conststream=Readable.from(buffer);
consthash=md5(buffer)
constexisting=awaitfileExists(hash);
if (existing) {
// If file already exists, let's skip it.
// If you want a different behavior such as override, modify this part.
continue;
}
constuploadStream=bucket.openUploadStream(filename, {
// make sure to add content type so that it will be easier to set later.
contentType:type,
metadata: {
hash:hash}, //add your metadata here if any
});
// pipe the readable stream to a writeable stream to save it to the database
awaitstream.pipe(uploadStream);
res.status(200).json({
hash:hash})
}
}
});
} catch (err:any) {
// example to check for a very specific error
if (err.code===formidableErrors.maxFieldsExceeded) {
}
console.error(err);
res.writeHead(err.httpCode||400, { 'Content-Type':'text/plain' });
res.end(String(err));
return;
}
returnres.json({ success:true });
}