Я использую 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)
})
})