Files
chatmail-core/upload-server/server.js
2020-06-13 15:09:57 +02:00

54 lines
1.5 KiB
JavaScript

const p = require('path')
const crypto = require('crypto')
const express = require('express')
const fs = require('fs')
const { pipeline } = require('stream')
const app = express()
const config = {
path: process.env.UPLOAD_PATH || p.resolve('./uploads'),
port: process.env.PORT || 8080,
hostname: process.env.HOSTNAME || '0.0.0.0',
baseurl: process.env.BASE_URL || null
}
if (!config.baseurl.endsWith('/')) config.baseurl = config.baseurl + '/'
if (!fs.existsSync(config.path)) {
fs.mkdirSync(config.path, { recursive: true })
}
const baseUrl = config.baseurl || `http://${config.hostname}:${config.port}/`
app.post('*', (req, res) => {
const filename = crypto.randomBytes(12).toString('hex')
const ws = fs.createWriteStream(p.join(config.path, filename))
pipeline(req, ws, err => {
if (err) console.error(err)
if (err) res.status(500).send(err.message)
const url = baseUrl + filename
console.log('file uploaded: ' + filename)
res.send(url)
})
})
app.get('/:filename', (req, res) => {
const filepath = p.normalize(p.join(config.path, req.params.filename))
if (!filepath.startsWith(config.path)) {
return res.code(500).send('bad request')
}
const rs = fs.createReadStream(filepath)
res.setHeader('content-type', 'application/octet-stream')
pipeline(rs, res, err => {
if (err) console.error(err)
if (err) res.status(500).send(err.message)
res.end()
})
})
app.listen(config.port, err => {
if (err) console.error(err)
else console.log('Listening on ' + baseUrl)
})