Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. /**
  2. * NPM Module dependencies.
  3. */
  4. const express = require('express');
  5. const photoRoute = express.Router();
  6.  
  7. const multer = require('multer');
  8. var storage = multer.memoryStorage()
  9. var upload = multer({ storage: storage, limits: { fields: 1, fileSize: 6000000, files: 1, parts: 2 }});
  10.  
  11. const mongodb = require('mongodb');
  12. const MongoClient = require('mongodb').MongoClient;
  13. const ObjectID = require('mongodb').ObjectID;
  14. let db;
  15.  
  16. /**
  17. * NodeJS Module dependencies.
  18. */
  19. const { Readable } = require('stream');
  20.  
  21. /**
  22. * Create Express server && Routes configuration.
  23. */
  24. const app = express();
  25. app.use('/photos', photoRoute);
  26.  
  27. /**
  28. * Connect Mongo Driver to MongoDB.
  29. */
  30. MongoClient.connect('mongodb://localhost/photoDB', (err, database) => {
  31. if (err) {
  32. console.log('MongoDB Connection Error. Please make sure that MongoDB is running.');
  33. process.exit(1);
  34. }
  35. db = database;
  36. });
  37.  
  38. /**
  39. * GET photo by ID Route
  40. */
  41. photoRoute.get('/:photoID', (req, res) => {
  42. try {
  43. var photoID = new ObjectID(req.params.photoID);
  44. } catch(err) {
  45. return res.status(400).json({ message: "Invalid PhotoID in URL parameter. Must be a single String of 12 bytes or a string of 24 hex characters" });
  46. }
  47.  
  48. let bucket = new mongodb.GridFSBucket(db, {
  49. bucketName: 'photos'
  50. });
  51.  
  52. let downloadStream = bucket.openDownloadStream(photoID);
  53.  
  54. downloadStream.on('data', (chunk) => {
  55. res.write(chunk);
  56. });
  57.  
  58. downloadStream.on('error', () => {
  59. res.sendStatus(404);
  60. });
  61.  
  62. downloadStream.on('end', () => {
  63. res.end();
  64. });
  65. });
  66.  
  67. /**
  68. * POST photo Route
  69. */
  70. photoRoute.post('/', (req, res) => {
  71. upload.single('photo')(req, res, (err) => {
  72. if (err) {
  73. return res.status(400).json({ message: "Upload Request Validation Failed" });
  74. } else if(!req.body.name) {
  75. return res.status(400).json({ message: "No photo name in request body" });
  76. }
  77.  
  78. let photoName = req.body.name;
  79.  
  80. // Covert buffer to Readable Stream
  81. const readablePhotoStream = new Readable();
  82. readablePhotoStream.push(req.file.buffer);
  83. readablePhotoStream.push(null);
  84.  
  85. let bucket = new mongodb.GridFSBucket(db, {
  86. bucketName: 'photos'
  87. });
  88.  
  89. let uploadStream = bucket.openUploadStream(photoName);
  90. let id = uploadStream.id;
  91. readablePhotoStream.pipe(uploadStream);
  92.  
  93. uploadStream.on('error', () => {
  94. return res.status(500).json({ message: "Error uploading file" });
  95. });
  96.  
  97. uploadStream.on('finish', () => {
  98. return res.status(201).json({ message: "File uploaded successfully, stored under Mongo ObjectID: " + id });
  99. });
  100. });
  101. });
  102.  
  103. app.listen(3005, () => {
  104. console.log("App listening on port 3005!");
  105. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement