mirror of
https://gitlab.com/MrFry/mrfrys-node-server
synced 2025-04-01 20:24:18 +02:00
File upload fixes
This commit is contained in:
parent
cdd01b70de
commit
f08079ba84
6 changed files with 178 additions and 56 deletions
|
@ -21,7 +21,7 @@
|
||||||
// package requires
|
// package requires
|
||||||
import express from 'express'
|
import express from 'express'
|
||||||
import bodyParser from 'body-parser'
|
import bodyParser from 'body-parser'
|
||||||
import busboy from 'connect-busboy'
|
import fileUpload from 'express-fileupload'
|
||||||
|
|
||||||
// other requires
|
// other requires
|
||||||
import logger from '../../utils/logger'
|
import logger from '../../utils/logger'
|
||||||
|
@ -86,10 +86,8 @@ function GetApp(): ModuleType {
|
||||||
app.use(express.static(pdir))
|
app.use(express.static(pdir))
|
||||||
})
|
})
|
||||||
app.use(
|
app.use(
|
||||||
busboy({
|
fileUpload({
|
||||||
limits: {
|
limits: { fileSize: 50 * 1024 * 1024 },
|
||||||
fileSize: 50000 * 1024 * 1024,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import fs from 'fs'
|
|
||||||
|
|
||||||
import logger from '../../../utils/logger'
|
import logger from '../../../utils/logger'
|
||||||
import utils from '../../../utils/utils'
|
import utils from '../../../utils/utils'
|
||||||
import { Request, SubmoduleData, User } from '../../../types/basicTypes'
|
import { Request, SubmoduleData, User } from '../../../types/basicTypes'
|
||||||
|
@ -11,7 +9,7 @@ function setup(data: SubmoduleData): void {
|
||||||
const { app /* userDB, url, publicdirs, moduleSpecificData */ } = data
|
const { app /* userDB, url, publicdirs, moduleSpecificData */ } = data
|
||||||
|
|
||||||
app.post('/postfeedbackfile', function(req: Request, res: any) {
|
app.post('/postfeedbackfile', function(req: Request, res: any) {
|
||||||
UploadFile(req, res, uloadFiles, () => {
|
utils.uploadFile(req, uloadFiles).then(() => {
|
||||||
res.json({ success: true })
|
res.json({ success: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -53,46 +51,9 @@ function setup(data: SubmoduleData): void {
|
||||||
res.json({ success: true })
|
res.json({ success: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
function UploadFile(req: Request, res: any, path: string, next) {
|
|
||||||
try {
|
|
||||||
req.pipe(req.busboy)
|
|
||||||
req.busboy.on('file', function(fieldname, file, filename) {
|
|
||||||
logger.Log('Uploading: ' + filename, logger.GetColor('blue'))
|
|
||||||
|
|
||||||
utils.CreatePath(path, true)
|
|
||||||
const date = new Date()
|
|
||||||
const fn =
|
|
||||||
date.getHours() +
|
|
||||||
'' +
|
|
||||||
date.getMinutes() +
|
|
||||||
'' +
|
|
||||||
date.getSeconds() +
|
|
||||||
'_' +
|
|
||||||
filename
|
|
||||||
|
|
||||||
const fstream = fs.createWriteStream(path + '/' + fn)
|
|
||||||
file.pipe(fstream)
|
|
||||||
fstream.on('close', function() {
|
|
||||||
logger.Log(
|
|
||||||
'Upload Finished of ' + path + '/' + fn,
|
|
||||||
logger.GetColor('blue')
|
|
||||||
)
|
|
||||||
next(fn)
|
|
||||||
})
|
|
||||||
fstream.on('error', function(err) {
|
|
||||||
console.error(err)
|
|
||||||
res.end('something bad happened :s')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
} catch (err) {
|
|
||||||
logger.Log(`Unable to upload file!`, logger.GetColor('redbg'))
|
|
||||||
console.error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
app.route('/fosuploader').post(function(req: Request, res: any) {
|
app.route('/fosuploader').post(function(req: Request, res: any) {
|
||||||
UploadFile(req, res, uloadFiles, (fn) => {
|
utils.uploadFile(req, uloadFiles).then(({ fileName }) => {
|
||||||
res.redirect('/f/' + fn)
|
res.redirect('/f/' + fileName)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ import fs from 'fs'
|
||||||
|
|
||||||
import logger from '../../../utils/logger'
|
import logger from '../../../utils/logger'
|
||||||
import utils from '../../../utils/utils'
|
import utils from '../../../utils/utils'
|
||||||
import { Request, SubmoduleData } from '../../../types/basicTypes'
|
import { Request, SubmoduleData, User } from '../../../types/basicTypes'
|
||||||
|
|
||||||
const usersFileName = '.users.json'
|
const usersFileName = '.users.json'
|
||||||
|
|
||||||
|
@ -13,16 +13,27 @@ function setup(data: SubmoduleData): void {
|
||||||
|
|
||||||
const userFilesDir = publicDir + 'userFiles'
|
const userFilesDir = publicDir + 'userFiles'
|
||||||
|
|
||||||
|
if (!utils.FileExists(userFilesDir)) {
|
||||||
|
utils.CreatePath(userFilesDir, true)
|
||||||
|
}
|
||||||
|
|
||||||
app.get('/listUserDir', (req: Request, res) => {
|
app.get('/listUserDir', (req: Request, res) => {
|
||||||
logger.LogReq(req)
|
logger.LogReq(req)
|
||||||
|
|
||||||
const subdir: any = req.query.subdir
|
const subdir: any = req.query.subdir
|
||||||
|
|
||||||
if (subdir) {
|
if (subdir) {
|
||||||
const safeSubdir = subdir.replace(/\./g, '').replace(/\/+/g, '')
|
const safeSubdir = subdir.replace(/\.+/g, '').replace(/\/+/g, '')
|
||||||
const dir = userFilesDir + '/' + safeSubdir
|
const dir = userFilesDir + '/' + safeSubdir
|
||||||
const usersFile = dir + '/' + usersFileName
|
const usersFile = dir + '/' + usersFileName
|
||||||
|
|
||||||
|
if (!utils.FileExists(dir)) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `Directory ${subdir} does not exists`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
if (!utils.FileExists(usersFile)) {
|
if (!utils.FileExists(usersFile)) {
|
||||||
utils.WriteFile('{}', usersFile)
|
utils.WriteFile('{}', usersFile)
|
||||||
}
|
}
|
||||||
|
@ -37,25 +48,27 @@ function setup(data: SubmoduleData): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
|
success: true,
|
||||||
files: utils.ReadDir(dir).reduce((acc, file) => {
|
files: utils.ReadDir(dir).reduce((acc, file) => {
|
||||||
const stat = fs.lstatSync(dir + '/' + file)
|
const stat = fs.lstatSync(dir + '/' + file)
|
||||||
|
|
||||||
|
if (stat.isDirectory()) {
|
||||||
|
return acc
|
||||||
|
}
|
||||||
|
|
||||||
acc.push({
|
acc.push({
|
||||||
name: file,
|
name: file,
|
||||||
path: dir.replace(publicDir, '') + '/' + file,
|
path: dir.replace(publicDir, '') + '/' + file,
|
||||||
size: stat.size,
|
size: stat.size,
|
||||||
uploadDate: stat.mtime.getTime(),
|
date: stat.mtime.getTime(),
|
||||||
user: users[file],
|
user: users[file] || -1,
|
||||||
})
|
})
|
||||||
return acc
|
return acc
|
||||||
}, []),
|
}, []),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
if (!utils.FileExists(userFilesDir)) {
|
|
||||||
utils.CreatePath(userFilesDir, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
|
success: true,
|
||||||
dirs: utils.ReadDir(userFilesDir).reduce((acc, file) => {
|
dirs: utils.ReadDir(userFilesDir).reduce((acc, file) => {
|
||||||
const stat = fs.lstatSync(userFilesDir + '/' + file)
|
const stat = fs.lstatSync(userFilesDir + '/' + file)
|
||||||
|
|
||||||
|
@ -66,12 +79,115 @@ function setup(data: SubmoduleData): void {
|
||||||
acc.push({
|
acc.push({
|
||||||
name: file,
|
name: file,
|
||||||
date: stat.mtime.getTime(),
|
date: stat.mtime.getTime(),
|
||||||
|
size: utils.ReadDir(userFilesDir + '/' + file).length,
|
||||||
})
|
})
|
||||||
return acc
|
return acc
|
||||||
}, []),
|
}, []),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
app.post('/deleteUserFile', (req: Request, res) => {
|
||||||
|
const dir: any = req.body.dir
|
||||||
|
const fname: any = req.body.fname
|
||||||
|
if (!dir || !fname) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `'dir' or 'fname' is undefined!`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const safeDir = dir.replace(/\.+/g, '').replace(/\/+/g, '')
|
||||||
|
const safeFname = fname.replace(/\.+/g, '.').replace(/\/+/g, '')
|
||||||
|
const filePath = userFilesDir + '/' + safeDir + '/' + safeFname
|
||||||
|
|
||||||
|
if (!utils.FileExists(filePath)) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `path does not exists!`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
utils.deleteFile(filePath)
|
||||||
|
const usersFile = userFilesDir + '/' + safeDir + '/' + usersFileName
|
||||||
|
const users = utils.ReadJSON(usersFile)
|
||||||
|
delete users[safeFname]
|
||||||
|
utils.WriteFile(JSON.stringify(users), usersFile)
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post('/newUserDir', (req: Request, res) => {
|
||||||
|
logger.LogReq(req)
|
||||||
|
|
||||||
|
const name: any = req.body.name
|
||||||
|
if (!name) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `name is undefined!`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const safeName = name.replace(/\.+/g, '').replace(/\/+/g, '')
|
||||||
|
|
||||||
|
if (utils.FileExists(userFilesDir + '/' + safeName)) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `Dir ${name} already exists`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
utils.CreatePath(userFilesDir + '/' + safeName, true)
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post('/uploadUserFile', (req: Request, res) => {
|
||||||
|
logger.LogReq(req)
|
||||||
|
|
||||||
|
const user: User = req.session.user
|
||||||
|
const dir = req.body.dir
|
||||||
|
if (!dir) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `dir '${dir}' is undefined!`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const safeDir = dir.replace(/\.+/g, '.').replace(/\/+/g, '/')
|
||||||
|
if (!utils.FileExists(userFilesDir + '/' + safeDir)) {
|
||||||
|
res.json({
|
||||||
|
success: false,
|
||||||
|
msg: `dir '${dir}' does not exists!`,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
utils
|
||||||
|
.uploadFile(req, userFilesDir + '/' + safeDir)
|
||||||
|
.then((body) => {
|
||||||
|
logger.Log(
|
||||||
|
`Successfull upload ${body.filePath}`,
|
||||||
|
logger.GetColor('blue')
|
||||||
|
)
|
||||||
|
|
||||||
|
const usersFile = userFilesDir + '/' + safeDir + '/' + usersFileName
|
||||||
|
const users = utils.ReadJSON(usersFile)
|
||||||
|
users[body.fileName] = user.id
|
||||||
|
utils.WriteFile(JSON.stringify(users), usersFile)
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
res.end('something bad happened :s')
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
|
@ -72,6 +72,7 @@ export interface Request extends express.Request {
|
||||||
cookies: any
|
cookies: any
|
||||||
session: any
|
session: any
|
||||||
busboy: any
|
busboy: any
|
||||||
|
files: any
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SubmoduleData {
|
export interface SubmoduleData {
|
||||||
|
|
|
@ -12,11 +12,14 @@ export default {
|
||||||
GetDateString: GetDateString,
|
GetDateString: GetDateString,
|
||||||
formatUrl: formatUrl,
|
formatUrl: formatUrl,
|
||||||
deleteFile: deleteFile,
|
deleteFile: deleteFile,
|
||||||
|
uploadFile: uploadFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import logger from '../utils/logger'
|
import logger from '../utils/logger'
|
||||||
|
|
||||||
|
import { Request } from '../types/basicTypes'
|
||||||
|
|
||||||
interface URLFormatOptions {
|
interface URLFormatOptions {
|
||||||
pathname?: string
|
pathname?: string
|
||||||
query?: any
|
query?: any
|
||||||
|
@ -177,3 +180,46 @@ function deleteFile(fname: string): Boolean {
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function uploadFile(req: Request, path: string): Promise<any> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
const file = req.files.file
|
||||||
|
// FIXME: Object.keys(req.files).forEach((file) => { saveFile() })
|
||||||
|
logger.Log('Uploading: ' + file.name, logger.GetColor('blue'))
|
||||||
|
|
||||||
|
CreatePath(path, true)
|
||||||
|
|
||||||
|
let fileName = file.name.replace(/\.+/g, '.').replace(/\/+/g, '/')
|
||||||
|
let fileDestination = path + '/' + fileName
|
||||||
|
if (FileExists(fileDestination)) {
|
||||||
|
const date = new Date()
|
||||||
|
const id = date.getHours() + date.getMinutes() + date.getSeconds()
|
||||||
|
|
||||||
|
const temp = file.name.split('.')
|
||||||
|
const extension = temp.pop()
|
||||||
|
fileName = temp.join('.') + '_' + id + '.' + extension
|
||||||
|
console.log(fileName)
|
||||||
|
fileDestination = path + '/' + fileName
|
||||||
|
}
|
||||||
|
|
||||||
|
file.mv(fileDestination, (err) => {
|
||||||
|
if (err) {
|
||||||
|
logger.Log(`Unable to upload file!`, logger.GetColor('redbg'))
|
||||||
|
console.error(err)
|
||||||
|
reject(err)
|
||||||
|
} else {
|
||||||
|
resolve({
|
||||||
|
body: req.body,
|
||||||
|
fileName: fileName,
|
||||||
|
filePath: fileDestination,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
logger.Log(`Unable to upload file!`, logger.GetColor('redbg'))
|
||||||
|
console.error(err)
|
||||||
|
reject(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 47a2227f87f4f2ca726c16328006de174fa04aac
|
Subproject commit 4f9a41dea854de5d0e14a6acb06d2c6accd5cebf
|
Loading…
Add table
Add a link
Reference in a new issue