Files
iblog2/routes/ue.js
eshengsky a324417752 +Promise
2019-06-19 14:04:31 +08:00

235 lines
8.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const express = require('express');
const router = express.Router();
const fs = require('fs');
const path = require('path');
const tool = require('../utility/tool');
const multer = require('multer');
const shortid = require('shortid');
// 图片上传配置
const storageImg = multer.diskStorage({
destination(req, file, cb) {
if (req.query.uniqueId) {
let dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId),
dirPath = path.join(dirPathParent, 'img'); // 不能直接创建dirPath因为父目录不存在会抛出异常
fs.mkdir(dirPathParent, err => {
if (err && err.code !== 'EEXIST') {
cb(err);
} else {
fs.mkdir(dirPath, err => {
if (err && err.code !== 'EEXIST') {
cb(err);
} else {
cb(null, dirPath);
}
});
}
});
} else {
cb(new Error('参数uniqueId不存在'));
}
},
filename(req, file, cb) {
const fileName = `${file.originalname.substring(0, file.originalname.lastIndexOf('.'))}_${shortid.generate()}`;
const ext = file.originalname.substr(file.originalname.lastIndexOf('.'));
const fullName = fileName + ext;
cb(null, fullName);
}
});
// 附件上传配置
const storageFile = multer.diskStorage({
destination(req, file, cb) {
if (req.query.uniqueId) {
let dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId),
dirPath = path.join(dirPathParent, 'file');
fs.mkdir(dirPathParent, err => {
if (err && err.code !== 'EEXIST') {
cb(err);
} else {
fs.mkdir(dirPath, err => {
if (err && err.code !== 'EEXIST') {
cb(err);
} else {
cb(null, dirPath);
}
});
}
});
} else {
cb(new Error('参数uniqueId不存在'));
}
},
filename(req, file, cb) {
const fileName = `${file.originalname.substring(0, file.originalname.lastIndexOf('.'))}_${shortid.generate()}`;
const ext = file.originalname.substr(file.originalname.lastIndexOf('.'));
const fullName = fileName + ext;
cb(null, fullName);
}
});
router.get('/', (req, res, next) => {
const list = [];
let total = 0;
const rootPath = path.join(__dirname, '../public/uploads/');
let rootFiles;
let parFiles;
let files;
let stat;
switch (req.query.action) {
// 获取配置
case 'config':
tool.getConfig(path.join(__dirname, '../config/ue.json')).then(settings => {
res.json(settings);
}, err => {
next(err);
});
break;
// 图片管理
case 'listimage':
rootFiles = fs.readdirSync(rootPath);
rootFiles.forEach(rootFile => {
stat = fs.statSync(path.join(rootPath, rootFile));
if (stat.isDirectory()) {
parFiles = fs.readdirSync(path.join(rootPath, rootFile));
parFiles.forEach(parFile => {
if (parFile === 'img') {
files = fs.readdirSync(path.join(rootPath, rootFile, 'img'));
total += files.length;
files.forEach(imgFile => {
list.push({
url: `/uploads/${rootFile}/img/${imgFile}`
});
});
}
});
}
});
res.json({
state: total === 0 ? 'no match file' : 'SUCCESS',
list,
total,
start: parseInt(req.query.start),
size: parseInt(req.query.size)
});
break;
// 附件管理
case 'listfile':
rootFiles = fs.readdirSync(rootPath);
rootFiles.forEach(rootFile => {
stat = fs.statSync(path.join(rootPath, rootFile));
if (stat.isDirectory()) {
parFiles = fs.readdirSync(path.join(rootPath, rootFile));
parFiles.forEach(parFile => {
if (parFile === 'file') {
files = fs.readdirSync(path.join(rootPath, rootFile, parFile));
total += files.length;
files.forEach(attachFile => {
list.push({
url: `/uploads/${rootFile}/file/${attachFile}`
});
});
}
});
}
});
res.json({
state: total === 0 ? 'no match file' : 'SUCCESS',
list,
total,
start: parseInt(req.query.start),
size: parseInt(req.query.size)
});
break;
}
});
router.post('/', (req, res, next) => {
let uploadFile;
switch (req.query.action) {
// 上传图片
case 'uploadimage':
uploadFile = multer({ storage: storageImg })
.single('upfile');
uploadFile(req, res, err => {
if (err) {
next(err);
} else {
res.json({
state: 'SUCCESS',
url: `/uploads/${req.query.uniqueId}/img/${req.file.filename}`, // 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
title: req.file.originalname,
original: req.file.originalname,
error: null
});
}
});
break;
// 上传涂鸦
case 'uploadscrawl':
var dataBuffer = new Buffer(req.body.upfile, 'base64'),
fileName = `${shortid.generate()}.png`;
if (req.query.uniqueId) {
// 不能直接创建dirPath因为父目录不存在会抛出异常
const dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId);
const dirPath = path.join(dirPathParent, 'img');
fs.mkdir(dirPathParent, err => {
if (err && err.code !== 'EEXIST') {
next(err);
} else {
fs.mkdir(dirPath, err => {
if (err && err.code !== 'EEXIST') {
next(err);
} else {
fs.writeFile(path.join(dirPath, fileName), dataBuffer, err => {
if (err) {
next(err);
} else {
res.json({
state: 'SUCCESS',
// 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
url: `/uploads/${req.query.uniqueId}/img/${fileName}`,
title: fileName,
original: fileName,
error: null
});
}
});
}
});
}
});
} else {
next(new Error('参数uniqueId不存在'));
}
break;
// 上传附件
case 'uploadfile':
uploadFile = multer({ storage: storageFile })
.single('upfile');
uploadFile(req, res, err => {
if (err) {
next(err);
} else {
res.json({
state: 'SUCCESS',
// 此处不能用path.join因为path会使用'\'分隔符而url地址必须是'/'分隔符
url: `/uploads/${req.query.uniqueId}/file/${req.file.filename}`,
title: req.file.originalname,
original: req.file.originalname,
error: null
});
}
});
break;
}
});
module.exports = router;