|
1 | | -const { multipart, tus, uploadx } = require('@uploadx/core'); |
2 | | -const express = require('express'); |
3 | | -const cors = require('cors'); |
| 1 | +const url = require('url'); |
| 2 | +const { tmpdir } = require('os'); |
| 3 | +const { createServer } = require('http'); |
| 4 | +const { DiskStorage, Multipart, Tus, Uploadx } = require('@uploadx/core'); |
4 | 5 |
|
5 | | -const PORT = process.env.PORT || 3002; |
6 | | -const app = express(); |
| 6 | +const port = process.env.PORT || 3002; |
7 | 7 |
|
8 | | -function buildRedirectUrl(req) { |
9 | | - const { uploadType = 'uploadx' } = req.query; |
10 | | - return `/${uploadType}`; |
11 | | -} |
| 8 | +const directory = `${tmpdir()}/uploadx/`; |
| 9 | +const path = '/files'; |
| 10 | +const pathRegexp = new RegExp(`^${path}([/?]|$)`); |
12 | 11 |
|
13 | | -const apiRedirect = (req, res, next) => { |
14 | | - res.redirect(308, buildRedirectUrl(req)); |
15 | | - next(); |
16 | | -}; |
17 | | - |
18 | | -const opts = { |
19 | | - directory: 'upload', |
20 | | - maxUploadSize: '2GB', |
| 12 | +const storage = new DiskStorage({ |
| 13 | + directory, |
| 14 | + path, |
| 15 | + maxUploadSize: '1GB', |
21 | 16 | allowMIME: ['video/*', 'image/*'], |
22 | | - expiration: { maxAge: '1h', purgeInterval: '10min' }, |
23 | | - logLevel: process.env.LOG_LEVEL || 'info' |
24 | | -}; |
25 | | - |
26 | | -app.use(cors()); |
27 | | -app.use(apiRedirect); |
| 17 | + logLevel: process.env.LOG_LEVEL || 'info', |
| 18 | + expiration: { maxAge: '1h', purgeInterval: '30min' } |
| 19 | +}); |
28 | 20 |
|
29 | | -app.use('/uploadx', uploadx(opts)); |
30 | | -app.use('/tus', tus(opts)); |
31 | | -app.use('/multipart', multipart({ ...opts, maxUploadSize: '100MB' })); |
| 21 | +const upx = new Uploadx({ storage }); |
| 22 | +const tus = new Tus({ storage }); |
| 23 | +const mpt = new Multipart({ storage }); |
32 | 24 |
|
33 | | -app.listen(PORT, () => console.log('listening on port:', PORT)); |
| 25 | +createServer((req, res) => { |
| 26 | + const { pathname, query = { uploadType: '' } } = url.parse(req.url, true); |
| 27 | + if (pathRegexp.test(pathname)) { |
| 28 | + switch (query.uploadType) { |
| 29 | + case 'multipart': |
| 30 | + mpt.handle(req, res); |
| 31 | + break; |
| 32 | + case 'tus': |
| 33 | + tus.handle(req, res); |
| 34 | + break; |
| 35 | + default: |
| 36 | + upx.handle(req, res); |
| 37 | + break; |
| 38 | + } |
| 39 | + } else { |
| 40 | + res.setHeader('Access-Control-Allow-Origin', '*'); |
| 41 | + res.statusCode = 404; |
| 42 | + res.end(); |
| 43 | + } |
| 44 | +}).listen(port, () => console.info(`listening on port: ${port}`)); |
0 commit comments