FileStoreController.coffee 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. logger = require('logger-sharelatex')
  2. FileStoreHandler = require("./FileStoreHandler")
  3. ProjectLocator = require("../Project/ProjectLocator")
  4. _ = require('underscore')
  5. is_mobile_safari = (user_agent) ->
  6. user_agent and (user_agent.indexOf('iPhone') >= 0 or
  7. user_agent.indexOf('iPad') >= 0)
  8. is_html = (file) ->
  9. ends_with = (ext) ->
  10. file.name? and
  11. file.name.length > ext.length and
  12. (file.name.lastIndexOf(ext) == file.name.length - ext.length)
  13. ends_with('.html') or ends_with('.htm') or ends_with('.xhtml')
  14. module.exports =
  15. getFile : (req, res)->
  16. project_id = req.params.Project_id
  17. file_id = req.params.File_id
  18. queryString = req.query
  19. user_agent = req.get('User-Agent')
  20. logger.log project_id: project_id, file_id: file_id, queryString:queryString, "file download"
  21. ProjectLocator.findElement {project_id: project_id, element_id: file_id, type: "file"}, (err, file)->
  22. if err?
  23. logger.err err:err, project_id: project_id, file_id: file_id, queryString:queryString, "error finding element for downloading file"
  24. return res.sendStatus 500
  25. FileStoreHandler.getFileStream project_id, file_id, queryString, (err, stream)->
  26. if err?
  27. logger.err err:err, project_id: project_id, file_id: file_id, queryString:queryString, "error getting file stream for downloading file"
  28. return res.sendStatus 500
  29. # mobile safari will try to render html files, prevent this
  30. if (is_mobile_safari(user_agent) and is_html(file))
  31. logger.log filename: file.name, user_agent: user_agent, "sending html file to mobile-safari as plain text"
  32. res.setHeader('Content-Type', 'text/plain')
  33. res.setContentDisposition('attachment', {filename: file.name})
  34. stream.pipe res