const path = require('path'); const fs = require('fs'); const request = require('superagent'); const parse = require('async-busboy'); const ext = { project: ['.txt', '.dwg', '.doc', '.docx', '.xls', '.xlsx', '.pdf', '.png', '.jpg', '.svg'], report: ['.doc', '.docx', '.xls', '.xlsx', '.pdf'], data: ['.txt', '.xls', '.xlsx'], image: ['.png', '.jpg', '.svg'], three: ['.js'], video: ['.mp4'], bpmn: ['.bpmn', '.bpmn20.xml', '.zip', '.bar'], app: ['.apk'], }; module.exports = { entry(app, router, opts) { const getApiRoot = async function (ctx) { const { apiUrl, pushStreamUrl, pushStreamHeartUrl } = opts; ctx.status = 200; ctx.body = { root: apiUrl, pushStreamUrl, pushStreamHeartUrl }; }; const upload = async function (ctx, next) { try { const { files } = await parse(ctx.req); const file = files[0]; const extname = path.extname(file.filename).toLowerCase(); const fileType = ctx.query.type || 'image'; const fileFolder = ctx.query.fileFolder || 'common'; if (ext[fileType].indexOf(extname) < 0) { ctx.status = 400; ctx.body = JSON.stringify({ name: 'UploadFailed', message: '文件格式无效' }); return; } const date = new Date().toLocaleDateString(); const time = new Date().getTime(); const fileName = `${time}_${file.filename}`; const saveFile = path.join(__dirname, '../../', `/client/assets/files/${fileFolder}`, fileName); const pathUrl = `./client/assets/files/${fileFolder}`; const res1 = fs.existsSync(`./client/assets/files/${fileFolder}`); !res1 && fs.mkdirSync(`./client/assets/files/${fileFolder}`); const res = fs.existsSync(pathUrl); !res && fs.mkdirSync(pathUrl); const stream = fs.createWriteStream(saveFile); fs.createReadStream(file.path).pipe(stream); stream.on('error', (err) => { app.fs.logger.log('error', '[Upload Heatmap]', err); }); ctx.status = 200; ctx.body = { filename: path.join(`/assets/files/${fileFolder}`, fileName), name: 'UploadSuccess', message: '上传成功' }; } catch (err) { ctx.status = 500; ctx.fs.logger.error(err); ctx.body = { err: 'upload error.' }; } }; const remove = async function (ctx, next) { try { const fkeys = ctx.request.body; const removeUrl = path.join(__dirname, '../../', './client', fkeys.url); const res = fs.existsSync(removeUrl); if (!res) { ctx.status = 400; ctx.body = JSON.stringify({ name: 'DeleteFailed', message: '文件地址不存在' }); return; } fs.unlink(removeUrl, (error) => { if (error) { console.log(error); } }); ctx.status = 200; ctx.body = { name: 'DeleteSuccess.', message: '删除成功' }; } catch (err) { ctx.status = 500; ctx.fs.logger.error(err); ctx.body = { err: 'upload cleanup error.' }; } }; const uploadForward = async function (ctx, next) { try { const { apiUrl } = opts; const { files } = await parse(ctx.req); const file = files[0]; const fileFolder = ctx.query.p || 'images'; const res = await request.post(`${apiUrl}/attachments/${fileFolder}`).attach('file', file.path); ctx.status = res.status; ctx.body = res.body; } catch (err) { ctx.status = 500; ctx.body = JSON.stringify({ err: err.toString() }); ctx.fs.logger.error('[/_upload/forward] request error:', err); } }; const getVideoProxy = async function (ctx) { try { const { url } = ctx.query; ctx.redirect(url); } catch (error) { // 处理错误情况 ctx.fs.logger.error('[/_video/proxy] request error:', error); ctx.status = 500; ctx.body = 'Error occurred while fetching and streaming video.'; } }; router.get('/api/root', getApiRoot); router.post('/_upload/forward', uploadForward); router.post('/_upload/new', upload); router.delete('/_upload/cleanup', remove); router.get('/_video/proxy', getVideoProxy); }, };