| import fs from 'fs' |
| import bytes from 'bytes' |
| import express from 'express' |
| import { fileTypeFromBuffer } from 'file-type' |
|
|
| const { SPACE_HOST } = process.env |
| express() |
| .set('json spaces', 4) |
| .use(express.json({ limit: '500mb' })) |
| .use(express.urlencoded({ extended: true, limit: '500mb' })) |
| .all('/', (_, res) => res.send('POST /upload')) |
| .use('/file', express.static('/tmp')) |
| .get(['/list', '/files'], (_, res) => { |
| const files = fs.readdirSync('/tmp', { withFileTypes: true }) |
| .filter(file => file.isFile()) |
| .map(file => `https://${SPACE_HOST}/file/${file.name}`) |
| res.send(files) |
| }) |
| .all('/upload', async (req, res) => { |
| if (req.method !== 'POST') return res.json({ message: 'Method not allowed' }) |
| |
| const { file } = req.body |
| if (!file && typeof file !== 'string' && !isBase64(file)) |
| return res.json({ message: 'Payload body file must be filled in base64 format' }) |
| |
| const fileBuffer = Buffer.from(file, 'base64') |
| const ftype = await fileTypeFromBuffer(fileBuffer) || { mime: 'file', ext: 'bin' } |
| const fileName = `${ftype.mime.split('/')[0]}-${Date.now().toString(16)}.${ftype.ext}` |
| await fs.promises.writeFile(`/tmp/${fileName}`, fileBuffer) |
| |
| res.json({ |
| name: fileName, |
| size: { |
| bytes: fileBuffer.length, |
| readable: bytes(+fileBuffer.length, { unitSeparator: ' ' }) |
| }, |
| type: ftype, |
| url: `https://${SPACE_HOST}/file/${fileName}` |
| }) |
| }) |
| .listen(7860, () => console.log('App running on port', 7860)) |
|
|
| function isBase64(str) { |
| try { |
| return btoa(atob(str)) === str |
| } catch { |
| return false |
| } |
| } |