123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- const express = require('express')
- const router = express.Router()
- const _ = require('lodash')
- const multer = require('multer')
- const path = require('path')
- const sanitize = require('sanitize-filename')
- /* global WIKI */
- /**
- * Upload files
- */
- router.post('/u', (req, res, next) => {
- multer({
- dest: path.resolve(WIKI.ROOTPATH, WIKI.config.dataPath, 'uploads'),
- limits: {
- fileSize: WIKI.config.uploads.maxFileSize,
- files: WIKI.config.uploads.maxFiles
- }
- }).array('mediaUpload')(req, res, next)
- }, async (req, res, next) => {
- if (!_.some(req.user.permissions, pm => _.includes(['write:assets', 'manage:system'], pm))) {
- return res.status(403).json({
- succeeded: false,
- message: 'You are not authorized to upload files.'
- })
- } else if (req.files.length < 1) {
- return res.status(400).json({
- succeeded: false,
- message: 'Missing upload payload.'
- })
- } else if (req.files.length > 1) {
- return res.status(400).json({
- succeeded: false,
- message: 'You cannot upload multiple files within the same request.'
- })
- }
- const fileMeta = _.get(req, 'files[0]', false)
- if (!fileMeta) {
- return res.status(500).json({
- succeeded: false,
- message: 'Missing upload file metadata.'
- })
- }
- // Get folder Id
- let folderId = null
- try {
- const folderRaw = _.get(req, 'body.mediaUpload', false)
- if (folderRaw) {
- folderId = _.get(JSON.parse(folderRaw), 'folderId', null)
- if (folderId === 0) {
- folderId = null
- }
- } else {
- throw new Error('Missing File Metadata')
- }
- } catch (err) {
- return res.status(400).json({
- succeeded: false,
- message: 'Missing upload folder metadata.'
- })
- }
- // Build folder hierarchy
- let hierarchy = []
- if (folderId) {
- try {
- hierarchy = await WIKI.models.assetFolders.getHierarchy(folderId)
- } catch (err) {
- return res.status(400).json({
- succeeded: false,
- message: 'Failed to fetch folder hierarchy.'
- })
- }
- }
- // Sanitize filename
- fileMeta.originalname = sanitize(fileMeta.originalname.toLowerCase().replace(/[\s,;#]+/g, '_'))
- // Check if user can upload at path
- const assetPath = (folderId) ? hierarchy.map(h => h.slug).join('/') + `/${fileMeta.originalname}` : fileMeta.originalname
- if (!WIKI.auth.checkAccess(req.user, ['write:assets'], { path: assetPath })) {
- return res.status(403).json({
- succeeded: false,
- message: 'You are not authorized to upload files to this folder.'
- })
- }
- // Process upload file
- await WIKI.models.assets.upload({
- ...fileMeta,
- mode: 'upload',
- folderId: folderId,
- assetPath,
- user: req.user
- })
- res.send('ok')
- })
- router.get('/u', async (req, res, next) => {
- res.json({
- ok: true
- })
- })
- module.exports = router
|