64 lines
1.5 KiB
JavaScript
64 lines
1.5 KiB
JavaScript
'use strict'
|
|
|
|
const http = require('http')
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
const pump = require('pump')
|
|
const through = require('through2')
|
|
const form = fs.readFileSync('public/form.html')
|
|
const maxFileSize = 51200
|
|
|
|
http.createServer((req, res) => {
|
|
if (req.method === 'GET') {
|
|
get(res)
|
|
return
|
|
}
|
|
if (req.method === 'PUT') {
|
|
put(req, res)
|
|
return
|
|
}
|
|
reject(405, 'Method Not Allowed', res)
|
|
}).listen(8080)
|
|
|
|
function get (res) {
|
|
res.writeHead(200, {'Content-Type': 'text/html'})
|
|
res.end(form)
|
|
}
|
|
|
|
function reject (code, msg, res) {
|
|
res.statusCode = code
|
|
res.end(msg)
|
|
}
|
|
|
|
function put (req, res) {
|
|
const size = parseInt(req.headers['content-length'], 10)
|
|
if (isNaN(size)) {
|
|
reject(400, 'Bad Request', res)
|
|
return
|
|
}
|
|
if (size > maxFileSize) {
|
|
reject(413, 'Too Large', res)
|
|
return
|
|
}
|
|
|
|
const name = req.headers['x-filename']
|
|
const field = req.headers['x-field']
|
|
const filename = `${field}-${Date.now()}-${name}`
|
|
const dest = fs.createWriteStream(path.join(__dirname, 'uploads', filename))
|
|
const counter = through(function (chunk, enc, cb) {
|
|
this.bytes += chunk.length
|
|
if (this.bytes > maxFileSize) {
|
|
cb(Error('size'))
|
|
return
|
|
}
|
|
cb(null, chunk)
|
|
})
|
|
counter.bytes = 0
|
|
counter.on('error', (err) => {
|
|
if (err.message === 'size') reject(413, 'Too Large', res)
|
|
})
|
|
pump(req, counter, dest, (err) => {
|
|
if (err) return reject(500, `Error saving ${name}!\n`, res)
|
|
res.end(`${name} successfully saved!\n`)
|
|
})
|
|
} |