1

I am trying to retrieve files from mongoose database. GridFS find file by _id download with the name of the file This link seems quite similar so I tried to implement the sourcecode on mine but it didn't work out. I would like to know where the error is located.

const express = require('express');
const server = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const multer = require('multer');
const {GridFsStorage} = require('multer-gridfs-storage');
const Grid = require('gridfs-stream');
const methodOverride = require('method-override');
const {fs} = require('fs');
const { application } = require('express');

// register view engine
server.set('view engine', 'ejs'); 


module.exports = server;

let port = 3000;
server.listen(port, () => {
  console.log(`Running at localhost:${port}`);
});

server.get('/', (req,res) => {
    const files = []; 
    res.render('index', {title : 'HOME', files});
});


server.get('/list', (req, res) => {
    gfs.files.find().toArray((err, files) => {
      // Check if files
      if (!files || files.length === 0) {
        res.render('list', { files: false });
      } else {
        files.map(file => {
          if (
            file.contentType === 'png'
          ) {
            file.isPdf = true; 
          }
        });
        res.render('list', { files: files });
      }
    });
  });


server.get('/:file_id',(req , res) => {
  var file_id = req.params.id;
  gfs.files.find({_id: file_id}).toArray(function (err, files) {
    if (err) {
      res.json(err);
    }
    if (files.length > 0) {
      var mime = files[0].contentType;
      var filename = files[0].filename;
      res.set('Content-Type', mime);
      res.set('Content-Disposition', "inline; filename=" + filename);
      var read_stream = gfs.createReadStream({_id: file_id});
      read_stream.pipe(res);
    } else {
      res.json(file_id+ '  This file does not exist.');
    }
  });
});

I am only getting "undefined This file does not exist." at http://localhost:3000/:62bb571d71c40d24ea68b589? whenever I click on 'download'.

And this is my list.ejs file.

<html lang="en">
    <%- include('./partials/header.ejs') %>
<body>
  <%- include('./partials/nav.ejs')%>

  <div class = "list content">
    <h2>File List</h2>
    <h3> Available Files </h3>

    <% if(files){ %>
      <% files.forEach(function(file) { %>
        <div class="card card-body mb-3">
          <%= file.filename %>
                <form action= "/delete<%= file._id %>" method="post"> 
                  <button class="delete">DELETE</button>
                </form>
                <form action="/:<%= file._id %>" method="get">
                  <input type="submit" value="DOWNLOAD" class="btn btn-primary btn-block">
                </form>

        </div>
        <% }) %>
          <% } else { %>
            <p>No files to show</p>
            <% } %>

  </div>

    

</body>
<%- include("./partials/footer.ejs") %>
</html>

Thank you for reading.

OneBite
  • 13
  • 4

0 Answers0