corgi/src/file/controllers/file.controller.ts

79 lines
2.1 KiB
TypeScript

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