Skip to content
Snippets Groups Projects
Commit 7bcf2a2d authored by Nick Anton Christoph Kleine-Tebbe's avatar Nick Anton Christoph Kleine-Tebbe
Browse files

file upload does not work

parent 8bea1604
No related branches found
No related tags found
No related merge requests found
const express = require('express')
const fileUpload = require('express-fileupload');
const cors = require('cors');
var bodyParser = require('body-parser')
// Create express instance
const app = express()
......@@ -13,6 +15,10 @@ const kolloquiums = require('./routes/kolloquiums')
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.use(cors())
app.use(fileUpload({
createParentPath: true
}));
app.use(users)
app.use(kolloquiums)
......
const { Router } = require('express')
const router = Router()
var fs = require("fs")
const kolloquiumDirectory = 'Kolloquiums'
function getDirectories(path) {
return fs.readdirSync(path).filter(function (file) {
......@@ -9,13 +11,14 @@ function getDirectories(path) {
});
}
// function removeDangerousSymbols(title) {
// return title
// }
function isEmpty(checkString) {
return (!checkString || checkString.trim().length == 0)
}
function removeDangerousSymbols(fname) {
// https://stackoverflow.com/a/31976060
// https://gist.github.com/doctaphred/d01d05291546186941e1b7ddc02034d3
// removed check for empty: if is empty, nothing should be done with the string by the other api functions
const fname_original = fname;
......@@ -26,10 +29,7 @@ function removeDangerousSymbols(fname) {
fname = fname.replaceAll(/[<>.:"\/\\\|?*\x00-\x1F]/g, '');
// advanced trim
fname = fname.replace(/\.$/, "");
// empty filename
if (!fname.length) {
fname = '_';
}
// forbidden filenames
if (fname.match(/^(CON|PRN|AUX|NUL|COM1|COM2|COM3|COM4|COM5|COM6|COM7|COM8|COM9|LPT1|LPT2|LPT3|LPT4|LPT5|LPT6|LPT7|LPT8|LPT9)(\..+)?$/)) {
fname = `_${fname}`;
......@@ -38,11 +38,11 @@ function removeDangerousSymbols(fname) {
return fname;
}
fs.mkdir('Kolloquiums',function(err) {
fs.mkdir(kolloquiumDirectory,function(err) {
if (err && err.code === "EEXIST") {
console.log('Kolloquiums Directory already existed')
}
else if (err && err.code != "EEXIST") {
else if (err) {
return console.error(err);
}
else {
......@@ -52,72 +52,99 @@ fs.mkdir('Kolloquiums',function(err) {
// Get Kolloquiums
router.use('/getKolloquiums', (req, res) => {
var directories = getDirectories('Kolloquiums')
console.log('/getKolloquiums')
var directories = getDirectories(kolloquiumDirectory)
return res.json({
kolloquiums: directories
});
})
// Get Abgaben
router.use('/getAbgaben', (req, res) => {
console.log('/getAbgaben')
let { kolloquium } = req.body
let safeKolloquium = removeDangerousSymbols(kolloquium)
console.log('from Kolloquium: ' + safeKolloquium)
if(isEmpty(safeKolloquium)) {
console.warn('Folder has no name')
return res.json({
success: false,
message: 'Folder has no name'
})
}
var directories = getDirectories(kolloquiumDirectory + '/' + safeKolloquium)
return res.json({
success: true,
abgaben: directories
});
})
// Delete Kolloquium
router.use('/deleteKolloquium', (req, res) => {
console.log('deleting Kolloquium')
console.log('/deleteKolloquium')
let { title } = req.body
if(!title || title.trim().length == 0) {
let safeTitle = removeDangerousSymbols(title)
if(isEmpty(safeTitle)) {
console.error('Folder has no name')
return res.json({
status: 'error',
success: false,
message: 'Folder has no name'
})
}
let safeTitle = removeDangerousSymbols(title)
fs.rmdir("Kolloquiums/" + safeTitle, function(err) {
fs.rmdir(kolloquiumDirectory + '/' + safeTitle, function(err) {
if (err) {
console.error(err);
return res.json({
status: 'error',
success: false,
message: err
})
}
});
return res.json({
status: 'success',
success: true,
message: 'removed Kolloquium ' + safeTitle
})
})
// Create Kolloquium
router.use('/createKolloquium', (req, res) => {
console.log('creating Kolloquium')
console.log('createKolloquium')
console.log(req.body)
let { title } = req.body
if( !title || title.trim().length == 0) {
let safeTitle = removeDangerousSymbols(title)
if(isEmpty(safeTitle)) {
console.error('Title was empty')
return res.json({
status: 'error',
success: false,
message: 'Title was empty'
})
}
let safeTitle = removeDangerousSymbols(title)
fs.mkdir('Kolloquiums/' + safeTitle, function(err) {
fs.mkdir(kolloquiumDirectory + '/' + safeTitle, function(err) {
if (err && err.code === "EEXIST") {
console.warn('Directory "' + safeTitle + '" already existed')
return res.json({
status: 'warning',
success: true,
message: 'Directory "' + safeTitle + '" already existed'
})
}
else if (err && err.code != "EEXIST") {
else if (err) {
console.error(err);
return res.json({
status: 'error',
success: false,
message: err
})
}
else {
console.log('Directory "' + safeTitle + '" created successfully!');
return res.json({
status: 'success',
success: true,
message: 'Directory "' + safeTitle + '" created successfully!'
})
}
......@@ -126,23 +153,24 @@ router.use('/createKolloquium', (req, res) => {
// Rename Kolloquium
router.use('/renameKolloquium', (req, res) => {
console.log('renaming Kolloquium')
console.log('/renameKolloquium')
console.log(req.body);
let { oldTitle, newTitle } = req.body
if( !oldTitle || oldTitle.trim().length == 0 || !newTitle || newTitle.trim().length == 0) {
let safeOldTitle = removeDangerousSymbols(oldTitle)
let safeNewTitle = removeDangerousSymbols(newTitle)
if(isEmpty(safeOldTitle) || isEmpty(safeNewTitle)) {
console.error('at least one of the names was empty')
return res.json({
status: 'error',
success: false,
message: 'at least one of the names was empty'
})
}
let oldSafeTitle = removeDangerousSymbols(oldTitle)
let newSafeTitle = removeDangerousSymbols(newTitle)
fs.rename('Kolloquiums/' + oldSafeTitle, 'Kolloquiums/' + newSafeTitle, (err) => {
fs.rename(kolloquiumDirectory + '/' + safeOldTitle, kolloquiumDirectory + '/' + safeNewTitle, (err) => {
if(err) {
console.error(err);
return res.json({
status: 'error',
success: false,
message: err
})
}
......@@ -151,4 +179,67 @@ router.use('/renameKolloquium', (req, res) => {
});
})
// Submit Abgabe
router.use('/submitAbgabe', (req, res) => {
console.log('/submitAbgabe')
let { kolloquium, name, matrikelnummer, file, filename } = req.body
console.log('filename: ' + filename)
// let file = file.file
let safeMatrikelnummer = removeDangerousSymbols(matrikelnummer)
let safeName = removeDangerousSymbols(name)
let safeKolloquium = removeDangerousSymbols(kolloquium)
if(isEmpty(safeKolloquium) || isEmpty(safeMatrikelnummer || isEmpty(safeName))) {
console.error('Matrikelnummer, Name or Kolloquium was empty')
return res.json({
success: false,
message: 'Matrikelnummer, Name or Kolloquium'
})
}
let directory = kolloquiumDirectory + '/' + safeKolloquium + '/' + safeMatrikelnummer + '_' + safeName;
console.log('directory: ' + directory)
fs.mkdir(directory, function(err) {
if (err && err.code === "EEXIST") {
console.warn('Directory "' + directory + '" already existed')
// return res.json({
// success: true,
// message: 'Directory "' + directory + '" already existed'
// })
}
else if (err) {
console.error(err);
return res.json({
success: false,
message: err
})
}
else {
console.log('Directory "' + directory + '" created successfully!');
// return res.json({
// success: true,
// message: 'Directory "' + directory + '" created successfully!'
// })
}
// fs.write(directory + '/' + filename, file, function(err) {
// if (err) {
// console.error(err);
// return res.json({
// success: false,
// message: err
// })
// }
// console.log("file '" + filename + "' was created!");
// return res.json({
// success: true,
// message: "file '" + filename + "' was created"
// })
// })
console.log('saving file ' + filename)
file.mv(directory + '/' + filename);
})
})
module.exports = router
<template>
<section class="container">
<div>
<Logo />
<h1 class="title">
{{ error.statusCode }}
</h1>
......
......@@ -11,7 +11,9 @@
"@nuxt/http": "latest",
"@nuxtjs/axios": "^5.13.6",
"body-parser": "^1.19.1",
"cors": "^2.8.5",
"express": "latest",
"express-fileupload": "^1.2.1",
"nuxt": "latest"
},
"devDependencies": {
......@@ -4734,6 +4736,17 @@
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
},
"node_modules/busboy": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
"integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
"dependencies": {
"dicer": "0.3.0"
},
"engines": {
"node": ">=4.5.0"
}
},
"node_modules/bytes": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
......@@ -5503,6 +5516,18 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/cosmiconfig": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
......@@ -6370,6 +6395,17 @@
"resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz",
"integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q=="
},
"node_modules/dicer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
"integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
"dependencies": {
"streamsearch": "0.1.2"
},
"engines": {
"node": ">=4.5.0"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
......@@ -7207,6 +7243,17 @@
"node": ">= 0.10.0"
}
},
"node_modules/express-fileupload": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.1.tgz",
"integrity": "sha512-fWPNAkBj+Azt9Itmcz/Reqdg3LeBfaXptDEev2JM8bCC0yDptglCnlizhf0YZauyU5X/g6v7v4Xxqhg8tmEfEA==",
"dependencies": {
"busboy": "^0.3.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
......@@ -15568,6 +15615,14 @@
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
},
"node_modules/streamsearch": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/strict-uri-encode": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
......@@ -21871,6 +21926,14 @@
"resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
},
"busboy": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
"integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
"requires": {
"dicer": "0.3.0"
}
},
"bytes": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
......@@ -22475,6 +22538,15 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"requires": {
"object-assign": "^4",
"vary": "^1"
}
},
"cosmiconfig": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
......@@ -23128,6 +23200,14 @@
"resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz",
"integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q=="
},
"dicer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
"integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
"requires": {
"streamsearch": "0.1.2"
}
},
"didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
......@@ -23815,6 +23895,14 @@
}
}
},
"express-fileupload": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.1.tgz",
"integrity": "sha512-fWPNAkBj+Azt9Itmcz/Reqdg3LeBfaXptDEev2JM8bCC0yDptglCnlizhf0YZauyU5X/g6v7v4Xxqhg8tmEfEA==",
"requires": {
"busboy": "^0.3.1"
}
},
"extend-shallow": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
......@@ -30175,6 +30263,11 @@
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
},
"streamsearch": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
},
"strict-uri-encode": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
......@@ -15,7 +15,9 @@
"@nuxt/http": "latest",
"@nuxtjs/axios": "^5.13.6",
"body-parser": "^1.19.1",
"cors": "^2.8.5",
"express": "latest",
"express-fileupload": "^1.2.1",
"nuxt": "latest"
},
"devDependencies": {
......
<template>
<div class="relative flex flex-col items-center justify-top min-h-screen bg-gray-100 sm:items-top sm:pt-0">
<box>
<template slot="title">
Abgabe für <span class="font-semibold">{{ this.$route.params.kolloquium }}</span> hochladen
</template>
<template slot="content">
Auf dieser Seite kann man seine CAD/Datasmith-Datei hochladen.
</template>
</box>
<box>
<template slot="title">
Details
</template>
<template slot="content">
<form
accept-charset="UTF-8"
v-on:submit.prevent="onSubmit()"
method="POST"
>
<div class="flex flex-row items-center mb-1">
Name:
<input class="ml-1 w-full rounded border p-1" v-model="name">
</div>
<div class="flex flex-row items-center mb-1">
Matrikelnummer:
<input class="ml-1 w-full rounded border p-1" v-model="matrikelnummer">
</div>
<div class="flex flex-row items-center mb-1">
Datei:
<input
type=file
ref="file"
@change="fileSelected"
class="ml-1 w-full rounded border p-1"
>
</div>
<button type="submit" class="border rounded mt-4 p-2 font-semibold text-white bg-green-500 hover:bg-green-600 focus:bg-green-700">
Hochladen
</button>
</form>
</template>
</box>
</div>
</template>
<script>
import Box from '~/components/Box'
import ListItem from '~/components/ListItem'
export default {
components: {
Box,
ListItem
},
data() {
return {
name: '',
matrikelnummer: '',
filename: '',
}
},
methods: {
fileSelected(e) {
// this.$emit('input', e.target.files[0])
this.file = this.$refs.file.files[0]
this.filename = this.file.name
},
onSubmit() {
let formData = new FormData()
formData.append('file', this.file)
formData.append('filename', this.filename)
formData.append('kolloquium', this.$route.params.kolloquium)
formData.append('name', this.name)
formData.append('matrikelnummer', this.matrikelnummer)
this.$axios.post(
'api/submitAbgabe',
formData,
{
headers: {
'content-type': 'multipart/form-data'
}
}
)
}
}
}
</script>
......@@ -49,7 +49,7 @@
<button class="border rounded mt-4 p-2 font-semibold text-white bg-green-500 hover:bg-green-600 focus:bg-green-700">
Aktivieren
</button>
<n-link to="/abgabe-hochladen">
<n-link :to="'/abgabe/' + selectedKolloquium">
<button class="border rounded mt-4 p-2 font-semibold text-white bg-blue-500 hover:bg-blue-600 focus:bg-blue-700">
Link Teilen
</button>
......@@ -77,17 +77,15 @@ export default {
return {
selectedKolloquium: "",
selectedAbgabe: "",
abgaben: [
"Hier ist eine Liste von Abgaben für das ausgewählte Kolloquium.",
"Man kann einzelne Abgaben löschen.",
"Wenn man auf Aktivieren klickt, werden die Abgaben vom Kolloquium in das VR-Programm geladen"
]
}
},
methods: {
selectKolloquium(kolloquium) {
async selectKolloquium(kolloquium) {
this.selectedKolloquium = kolloquium.title
this.selectedAbgabe = ''
this.abgaben = []
const data = await this.$axios.$post('/api/getAbgaben/', { kolloquium: kolloquium.title })
this.abgaben = data.abgaben
},
selectAbgabe(abgabe) {
this.selectedAbgabe = abgabe
......@@ -134,16 +132,17 @@ export default {
}
},
},
async asyncData ({ $http }) {
const data = await $http.$get('/api/getKolloquiums/')
async asyncData ({ $axios }) {
const dataKolloquiums = await $axios.$get('/api/getKolloquiums/')
let kolloquiumList = []
data.kolloquiums.forEach(title => {
dataKolloquiums.kolloquiums.forEach(title => {
kolloquiumList.push({
title: title,
inEdit: false
})
})
return { kolloquiums: kolloquiumList }
const dataAbgaben = await $axios.$post('/api/getAbgaben/', { kolloquium: kolloquiumList[0].title })
return { kolloquiums: kolloquiumList, abgaben: dataAbgaben.abgaben, selectedKolloquium: kolloquiumList[0].title }
},
}
</script>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment