import { role, router } from 'decorators/router' import BaseController from 'common/base.controller' import config from 'config/config' import { FileHistory } from 'models/FileHistory' import QRCode from 'qrcode' const mime = require('mime-types') let generateQr = function (path, content) { return new Promise((resolve, reject) => { QRCode.toFile( path, content, { color: { dark: '#000', light: '#0000', }, }, function (err) { if (err) { reject && reject(err) } else { resolve && resolve({}) } }, ) }) } let mvFile = function (path, fileObj) { return new Promise((resolve, reject) => { fileObj.mv(path, function (err) { if (err) { reject && reject(err) } else { resolve && resolve({}) } }) }) } let getDayPath = function () { const data = new Date() return `${data.getFullYear()}/${data.getMonth()}/${data.getDay()}` } class FileController extends BaseController { @role('anon') @router('post /file/upload_one') async upload(req, res) { const files = req.raw.files if (!files || Object.keys(files).length === 0) { return { code: 10, msg: 'No files were uploaded.' } } let img = files.image let ext = mime.extension(img.mimetype) let data = (await FileHistory.findOrCreate({ _id: img.md5 })).doc data.fileExt = ext data.mimetype = img.mimetype let fileName = `${img.md5}.${ext}` let fileNameQr = `${img.md5}_qr.png` let url = `${config.file.show_url}/${getDayPath()}/${fileName}` let urlQr = `${config.file.show_url}/${getDayPath()}/${fileNameQr}` let target = `${config.file.upload_location}/${getDayPath()}/${fileName}` let qrPath = `${config.file.upload_location}/${getDayPath()}/${fileNameQr}` data.reqInfo = req.headers if (data.isFirst) { data.localPath = target if (req.user) { data.user = req.user.id } data.isFirst = false await mvFile(target, img) await generateQr(qrPath, url) } await data.save() return { code: 0, img: url, qr: urlQr } } } export default FileController