Как получить файлы, загруженные через multer, используя mon goose? - PullRequest
0 голосов
/ 29 февраля 2020

Я использую приведенную ниже функцию для получения файлов, загружаемых multer в mongodb. Запрос возвращает пустой массив.

exports.getPhotos = async (req, res) => {

    const photos = await Photo.find()
        .then(photos => {
            res.status(200).json(photos);
        })
        .catch(err => res.status(500).json({message: "Something went wrong"}));
};

, и это схема изображения. Есть ли способ получить файлы без указания схемы?


const mongoose = require("mongoose");
const {ObjectId} = mongoose.Schema;

const photoSchema = new mongoose.Schema({
    lenght: {
        type: String,
    },
    chunkSize: {
        type: String,
        required: true
    },
    uploadDate: {
        type: Date,
    },
    filename: {
        type: String,
    },
    md5: {
        type: String,
    },
    contentType: {
        type: String,
    },

});

module.exports = mongoose.model("Photo", photoSchema);

1 Ответ

0 голосов
/ 01 марта 2020

Я использую gridfs, чтобы он мог загружать большие файлы тоже. фрагмент примера кода ниже

//Connecting to mongo 
const conn = mongoose.createConnection(mongoURI);

//Init gfs 
let gfs; 
conn.once('open', ()=>{
    gfs = GridFsStream(conn.db, mongoose.mongo);
    gfs.collection('uploads');
})
//Creating Storage engine 
const storage = new GridFsStorage({
    url:mongoURI,
    file: (req, file) => {
        return new Promise((resolve, reject)=>{
            crypto.randomBytes(16,(err, buf)=>{
                if(err){
                    return reject(err)
                }
                const fileName = buf.toString('hex') + path.extname(file.originalname)
                //bucket name should match the collection name 
                const fileInfo = {
                    filename:fileName,
                    bucketName:'uploads'
                }
                resolve(fileInfo);
            })
        })
    }
})
const upload = multer({storage})

теперь используйте эту const для загрузки в ваших путях, как показано ниже, есть несколько методов для загрузки, таких как массив, одиночный и ... в зависимости от количества загружаемых файлов , аргумент 'uploadedFile' - это имя входного файла, и вы должны подумать о том, чтобы установить его в своем интерфейсе.

app.post('/',upload.single('uploadedFile'),(req, res)=>{
    res.json('file uploaded')
})

это промежуточное ПО для загрузки добавляет файлы к вашему запросу, которые вы можете использовать для помещения имен файлов в вашу базу данных, а затем извлекать их по этим уникальным именам с помощью маршрута, подобного приведенному ниже.

app.get('/:filename', (req, res)=>{
    gfs.files.findOne({filename:req.params.filename},(err,file)=>{
        if(!file || file.length === 0){
            return res.status(404).json({
                err:'No file Exists'
            })
        }
            const readStream = gfs.createReadStream(file.filename);
            readStream.pipe(res)
    })
})
...