79 lines
2.1 KiB
TypeScript
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
|