FEAT: Uploading is pretty much complete.
This commit is contained in:
parent
a9318e1ae3
commit
07952933b2
@ -12,6 +12,7 @@ import {verifyToken} from "./authenicate";
|
||||
import jwt from "jsonwebtoken";
|
||||
import {config} from "dotenv";
|
||||
import Multer from "multer";
|
||||
import {readFileSync, rmSync, writeFileSync} from "fs";
|
||||
|
||||
/**
|
||||
* App details
|
||||
@ -49,6 +50,7 @@ APP.use(cors(corsOptions));
|
||||
APP.use(verifyToken);
|
||||
APP.use(LogRequestMiddleware);
|
||||
APP.use(express.json());
|
||||
APP.use(express.urlencoded({extended: true}));
|
||||
|
||||
/**
|
||||
* Create routes for modular routing
|
||||
@ -211,21 +213,64 @@ v1.post("/update", (req: Request, res: Response): void => {
|
||||
}
|
||||
});
|
||||
|
||||
const upload = Multer({dest: "tmp/"});
|
||||
const upload = Multer({
|
||||
dest: "tmp/",
|
||||
limits: {
|
||||
fileSize: 1024 * 1024 * 100
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Custom type for the multer uploads.
|
||||
*/
|
||||
interface UploadedFile {
|
||||
fieldname: string;
|
||||
originalname: string;
|
||||
encoding: string;
|
||||
mimetype: string;
|
||||
destination: string;
|
||||
filename: string;
|
||||
path: string;
|
||||
size: number;
|
||||
}
|
||||
|
||||
// IMPORTANT! Calling this will expect sudo in places in the FS that require sudo
|
||||
v1.post("/upload", upload.array("files"), (req: Request, res: Response) => {
|
||||
if (!req.files) {
|
||||
res.status(400);
|
||||
}
|
||||
|
||||
const files = req.files || [];
|
||||
console.log(files);
|
||||
// Directory to upload the files to
|
||||
const cwd: string[] = JSON.parse(req.body.path);
|
||||
|
||||
// for (const file of files) {
|
||||
// console.log(file);
|
||||
// }
|
||||
const files = (req as any).files as UploadedFile[];
|
||||
files.forEach((file) => {
|
||||
try {
|
||||
// Get the data that was written to the local tmp path
|
||||
const data: Buffer = readFileSync(file.path);
|
||||
|
||||
res.status(204);
|
||||
// Generate the new path in the FS
|
||||
const newPath: string = path.join("/", ...cwd, file.originalname);
|
||||
|
||||
// Write the new file
|
||||
writeFileSync(newPath, data);
|
||||
|
||||
// Delete the tmp file using a relative path
|
||||
rmSync("./" + file.path);
|
||||
} catch (error: any) {
|
||||
if (error.code === 'EACCES') {
|
||||
return res.status(403).json({code: 403, error: "Permission denied."}); // Specific error
|
||||
} else if (error.code === 'ENOSPC') {
|
||||
return res.status(507).json({code: 507, error: "Insufficient storage."}); // Specific error
|
||||
} else if (error instanceof TypeError) {
|
||||
return res.status(400).json({code: 400, error: "Invalid data type."}); // Example of instance check
|
||||
} else {
|
||||
return res.status(500).json({code: 500, error: "Error processing file."}); // Generic error
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
res.status(200).json({code: 200, message: "Success"});
|
||||
});
|
||||
/**
|
||||
* Apply the routes to the server
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import "../index.css"
|
||||
import {useEffect, useRef, useState} from "react";
|
||||
import {useRef, useState} from "react";
|
||||
|
||||
/**
|
||||
* The list of files that the user is attempting to upload.
|
||||
@ -80,15 +80,6 @@ export default function Uploader({close, upload}) {
|
||||
upload(files);
|
||||
};
|
||||
|
||||
/**
|
||||
* Debugging
|
||||
*/
|
||||
useEffect(() => {
|
||||
files.forEach((file) => {
|
||||
console.log(file)
|
||||
});
|
||||
}, [files]);
|
||||
|
||||
return (
|
||||
<div className="fixed inset-0 z-50 flex items-center justify-center">
|
||||
<div className="fixed -inset-10 bg-black opacity-50 blur-lg"></div>
|
||||
|
||||
@ -84,7 +84,7 @@ export default function Dashboard() {
|
||||
|
||||
setSelected([]);
|
||||
|
||||
}, [path]);
|
||||
}, [path, uploading]);
|
||||
|
||||
|
||||
// Redirect if the user isn't logged in, otherwise update the state.
|
||||
@ -307,24 +307,36 @@ export default function Dashboard() {
|
||||
formData.append('files', _files[i]); // 'files' is the field name
|
||||
}
|
||||
|
||||
// Add the current path to the form data.
|
||||
// formData.append('path', "/" + path.join("/"));
|
||||
formData.append('path', JSON.stringify(path));
|
||||
|
||||
const resp = await fetch(`${backendUrl}/v1/upload`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": `Bearer ${token}`,
|
||||
},
|
||||
body: formData,
|
||||
})
|
||||
|
||||
if (!resp.ok) {
|
||||
console.error("SHIT WE WRONG POOKIE");
|
||||
const data = await resp.json()
|
||||
setError(data.error);
|
||||
return data;
|
||||
}
|
||||
|
||||
return await resp.json();
|
||||
};
|
||||
|
||||
console.log(files);
|
||||
uploadFiles(files).then((data) => {console.log(data)});
|
||||
if (files.length === 0) {
|
||||
setError("Cannot upload nothing. Please select files to upload.");
|
||||
return;
|
||||
}
|
||||
|
||||
uploadFiles(files).then((data) => {
|
||||
if (data.code === 200) {
|
||||
setUploading(false);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user