upload.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. const express = require('express')
  2. const router = express.Router()
  3. const _ = require('lodash')
  4. const multer = require('multer')
  5. const path = require('path')
  6. const sanitize = require('sanitize-filename')
  7. /**
  8. * Upload files
  9. */
  10. router.post('/u', (req, res, next) => {
  11. multer({
  12. dest: path.resolve(WIKI.ROOTPATH, WIKI.config.dataPath, 'uploads'),
  13. limits: {
  14. fileSize: WIKI.config.uploads.maxFileSize,
  15. files: WIKI.config.uploads.maxFiles
  16. }
  17. }).array('mediaUpload')(req, res, next)
  18. }, async (req, res, next) => {
  19. if (!_.some(req.user.permissions, pm => _.includes(['write:assets', 'manage:system'], pm))) {
  20. return res.status(403).json({
  21. succeeded: false,
  22. message: 'You are not authorized to upload files.'
  23. })
  24. } else if (req.files.length < 1) {
  25. return res.status(400).json({
  26. succeeded: false,
  27. message: 'Missing upload payload.'
  28. })
  29. } else if (req.files.length > 1) {
  30. return res.status(400).json({
  31. succeeded: false,
  32. message: 'You cannot upload multiple files within the same request.'
  33. })
  34. }
  35. const fileMeta = _.get(req, 'files[0]', false)
  36. if (!fileMeta) {
  37. return res.status(500).json({
  38. succeeded: false,
  39. message: 'Missing upload file metadata.'
  40. })
  41. }
  42. // Get folder Id
  43. let folderId = null
  44. try {
  45. const folderRaw = _.get(req, 'body.mediaUpload', false)
  46. if (folderRaw) {
  47. folderId = _.get(JSON.parse(folderRaw), 'folderId', null)
  48. if (folderId === 0) {
  49. folderId = null
  50. }
  51. } else {
  52. throw new Error('Missing File Metadata')
  53. }
  54. } catch (err) {
  55. return res.status(400).json({
  56. succeeded: false,
  57. message: 'Missing upload folder metadata.'
  58. })
  59. }
  60. // Build folder hierarchy
  61. let hierarchy = []
  62. if (folderId) {
  63. try {
  64. hierarchy = await WIKI.db.assetFolders.getHierarchy(folderId)
  65. } catch (err) {
  66. return res.status(400).json({
  67. succeeded: false,
  68. message: 'Failed to fetch folder hierarchy.'
  69. })
  70. }
  71. }
  72. // Sanitize filename
  73. fileMeta.originalname = sanitize(fileMeta.originalname.toLowerCase().replace(/[\s,;#]+/g, '_'))
  74. // Check if user can upload at path
  75. const assetPath = (folderId) ? hierarchy.map(h => h.slug).join('/') + `/${fileMeta.originalname}` : fileMeta.originalname
  76. if (!WIKI.auth.checkAccess(req.user, ['write:assets'], { path: assetPath })) {
  77. return res.status(403).json({
  78. succeeded: false,
  79. message: 'You are not authorized to upload files to this folder.'
  80. })
  81. }
  82. // Process upload file
  83. await WIKI.db.assets.upload({
  84. ...fileMeta,
  85. mode: 'upload',
  86. folderId: folderId,
  87. assetPath,
  88. user: req.user
  89. })
  90. res.send('ok')
  91. })
  92. router.get('/u', async (req, res, next) => {
  93. res.json({
  94. ok: true
  95. })
  96. })
  97. module.exports = router