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.