ProjectUploadController.coffee 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. logger = require "logger-sharelatex"
  2. metrics = require "metrics-sharelatex"
  3. fs = require "fs"
  4. Path = require "path"
  5. FileSystemImportManager = require "./FileSystemImportManager"
  6. ProjectUploadManager = require "./ProjectUploadManager"
  7. AuthenticationController = require('../Authentication/AuthenticationController')
  8. Settings = require "settings-sharelatex"
  9. Errors = require "../Errors/Errors"
  10. multer = require('multer')
  11. upload = null
  12. try
  13. upload = multer(
  14. dest: Settings.path.uploadFolder
  15. limits: fileSize: Settings.maxUploadSize
  16. )
  17. catch err
  18. if err.message == "EEXIST"
  19. logger.log uploadFolder:Settings.path.uploadFolder, "dir already exists, continuing"
  20. else
  21. logger.err err:err, "caught error from multer in uploads router"
  22. module.exports = ProjectUploadController =
  23. uploadProject: (req, res, next) ->
  24. timer = new metrics.Timer("project-upload")
  25. user_id = AuthenticationController.getLoggedInUserId(req)
  26. {originalname, path} = req.file
  27. name = Path.basename(originalname, ".zip")
  28. ProjectUploadManager.createProjectFromZipArchive user_id, name, path, (error, project) ->
  29. fs.unlink path, ->
  30. timer.done()
  31. if error?
  32. logger.error
  33. err: error, file_path: path, file_name: name,
  34. "error uploading project"
  35. if error.name? && error.name == 'InvalidError'
  36. res.status(422).json { success: false, error: req.i18n.translate(error.message) }
  37. else
  38. res.status(500).json { success: false, error: req.i18n.translate("upload_failed") }
  39. else
  40. logger.log
  41. project: project._id, file_path: path, file_name: name,
  42. "uploaded project"
  43. res.send success: true, project_id: project._id
  44. uploadFile: (req, res, next) ->
  45. timer = new metrics.Timer("file-upload")
  46. name = req.file?.originalname
  47. path = req.file?.path
  48. project_id = req.params.Project_id
  49. folder_id = req.query.folder_id
  50. if !name? or name.length == 0 or name.length > 150
  51. logger.err project_id:project_id, name:name, "bad name when trying to upload file"
  52. return res.send success: false
  53. logger.log folder_id:folder_id, project_id:project_id, "getting upload file request"
  54. user_id = AuthenticationController.getLoggedInUserId(req)
  55. FileSystemImportManager.addEntity user_id, project_id, folder_id, name, path, true, (error, entity) ->
  56. fs.unlink path, ->
  57. timer.done()
  58. if error?
  59. logger.error
  60. err: error, project_id: project_id, file_path: path,
  61. file_name: name, folder_id: folder_id,
  62. "error uploading file"
  63. res.send success: false
  64. else
  65. logger.log
  66. project_id: project_id, file_path: path, file_name: name, folder_id: folder_id
  67. "uploaded file"
  68. res.send success: true, entity_id: entity?._id, entity_type: entity?.type
  69. multerMiddleware: (req, res, next) ->
  70. return res.status(500).json {success: false, error: req.i18n.translate("upload_failed")} unless upload?
  71. upload.single('qqfile') req, res, (err) ->
  72. if err instanceof multer.MulterError && err.code == 'LIMIT_FILE_SIZE'
  73. return res.status(422).json {success: false, error: req.i18n.translate("file_too_large")}
  74. next(err)