Skip to content

Instantly share code, notes, and snippets.

@ortense
Last active January 26, 2018 18:16
Show Gist options
  • Save ortense/835a30fc1a1588fae9569f30247af4c9 to your computer and use it in GitHub Desktop.
Save ortense/835a30fc1a1588fae9569f30247af4c9 to your computer and use it in GitHub Desktop.

Node stream big file

../big-file-download
├── package.json
├── src
│   └── server.js
└── static
    ├── index.html
    ├── not-found.html
    └── very-big-file.xlsx <- 100mb
{
"name": "big-file-download",
"version": "1.0.0",
"scripts": {
"start": "node src/server.js"
},
"author": "Marcus Ortense",
"dependencies": {
"mime-types": "^2.1.17"
}
}
const fs = require('fs')
const http = require('http')
const path = require('path')
const mime = require('mime-types')
const errorHandler = (error, response) => {
response.statusCode = 500
response.setHeader('Content-Type', 'text/html')
response.end(`<h1>${error.message}</h1>`)
}
const render = (file, status = 200) => (request, response) => {
const filePath = path.resolve(__dirname, `../static/${file}`)
response.statusCode = status
response.setHeader('Content-Type', 'text/html')
fs.readFile(filePath, 'utf8', (error, content) => {
if (error) return errorHandler(error, response)
return response.end(content)
})
}
const stream = file => (request, response) => {
const filePath = path.resolve(__dirname, `../static/${file}`)
const readStream = fs.createReadStream(filePath)
response.statusCode = 200
response.setHeader('Content-Type', mime.lookup(file))
readStream.on('error', error => errorHandler(error, response))
readStream.pipe(response)
}
const routes = {
'/': render('index.html'),
'/not-found': render('not-found.html', 404),
'/big-file.xlsx': stream('very-big-file.xlsx')
}
const server = http.createServer((request, response) =>
(routes[request.url] || routes['/not-found'])(request, response))
server.listen(3000, () => console.log('Server up at http://localhost:3000'))
@CassiaDeny
Copy link

  • const mime = require('mime-types')

@ortense
Copy link
Author

ortense commented Jan 24, 2018

@CassiaDeny feito

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment