serve-gridfs
v0.0.6
Published
serve files with mongodb grdifs
Downloads
8
Readme
serve-gridfs
Middleware to serve static files using mongodb gridfs
Based on serve-static
Tested on node 7.x, npm 4.x
Require node-mongodb-native 2.x
Install
$ npm i serve-gridfs
API
import serveGridfs from 'serve-gridfs'
serveGridfs(mongoConnection, { options })
Create a new middleware function to serve files from a mongodb gridfs collection. The file to be served is based on req.url
. In a default setting, when a file is not found, this middleware call next()
, instead of returning 404
, to be in line with the express serve-static middleware.
mongoConnection
Internally, this middleware use promised based mongo client, so pass in the connection detail here.
const mongoConnection = MongoClient.connect('mongodb://localhost:27017/myApp')
Options
All options are optional
|Key | Type | Default | Note
|--- | --- | --- | --- |
|bucketName | string | 'fs' | Default set by mongodb
|chunkSizeBytes | number | 261120 | 255 * 1024
|writeConcern | object | null ||
|readPreference | object | null ||
|||||
| byId | bool | true | The file sepecified in req.url
by default is the mongodb _id
, if set to false
, mongodb will look for filename
instead of _id
, see example below. When multiple files have the same filename, by default, the latest file will be served
|acceptRanges | bool | true | Setting to false
will not send Accept-Ranges
and ignore the contents of the Range
request header
|cacheControl | bool or string | true | Setting to false
will disable the Cache-Control
in a response header. The default is public, max-age=0. You can set this to any string, which will also overide the maxAge key below.
|maxAge | number | 0 | Set this to whatever you like in seconds
|etag | bool | true | md5 generated by mongodb gridfs
|lastModified | bool | true |
|fallthrough | bool | true | By default, when the file specified in req.url
cannot be found in mongodb gridfs collection, a next()
will be called without an error. If set to false
, a next(new Error('FileNotFound))
will be called. Also, setting to false
will throw a 405
http status code if req.method
is not GET
or HEAD
|setHeaders | function | null | signature function (res, path, stat) {}
. path
is the requested file path, the stat
is the stat of the file if present, produced by mongodb fs.files, typically, it is { _id, length, chuckSize, uploadDate, md5, filename }
, see uploadStream
Example
// with express js
import express from 'express'
import { MongoClient, GridFSBucket } from 'mongodb'
import serveGridfs from 'serve-gridfs'
const app = express()
const mongoConnection = MongoClient.connect('mongodb://localhost:27017/myApp')
app.use('/uploads', serveGridfs(mongoConnection))
app.use('/uploads_byname', serveGridfs(mongoConnection, { byId: false }))
const options = {
bucketName: 'somethingElse',
setHeaders(res, path, stat) {
if (stat && stat.contentType === 'application/pdf' && stat.length > 102400000) res.setHeader('Content-Disposition', 'attachment; filename = ' + path)
}
}
app.use('/uploads2', serveGridfs(mongoConnection, { bucketName: 'somethingElse' }))
Retriving a file
# Assuming there is a file with an _id of 001 and a filename of cat.png in mongodb gridfs collection, the following commands will retrieve the same file
$ curl http://localhost:3000/uploads/001
$ curl http://localhost:3000/uploads_byname/cat.png
Notes
- Due to gridfs configuration, you can have an _id or filename containing slash, such as
cat/001
orcat/tom.png
as an _id and filename respectively. In this case,curl http://localhost:3000/uploads/cat/001
andcurl http://localhost:3000/uploads_byname/cat/tom.png
will resolve to the same file.