file.js 4.44 KB
'use strict';

const CDNCONFIG = require('../../../config/cdn_config');
const _ = require('lodash');
const moment = require('moment');
const Router = require('koa-router');
const fs = require('fs');
const path = require('path');
const router = new Router();
const FileApi = require('../../ci/file');
const qnFeature = require('../../../lib/qiniu')(CDNCONFIG.feature);

/**
 * 处理列表数据
 */
const _handleListItems = items => {
    _.forEach(items, perFile => {
        perFile.fsizekb = (perFile.fsize / 1024).toFixed(2) + 'kb';

        let dateTime = _.parseInt(perFile.putTime.toString().substring(0, 13));

        perFile.putTimeFormat = moment(dateTime).format('YYYY-MM-DD HH:mm');
        perFile.link = _.get(CDNCONFIG.feature, 'origin') + '/' + perFile.key;
    });

    return items;
};

const file =  {
    /**
     * 文件管理页面
     */
    page: async(ctx) => {
        await ctx.render('/action/file_page', {domain: _.get(CDNCONFIG.feature, 'origin')});
    },

    /**
     * 列出上传记录
     */
    listLogs: async(ctx) => {
        let fileApi = new FileApi();
        let result = await fileApi.getAllLogs({
            page: ctx.query.page
        });

        ctx.body = {
            code: 200,
            message: '',
            data: result
        }
    },

    /**
     * 列出包内的文件
     */
    listFiles: async(ctx) => {
        let params = {
            prefix: ctx.query.actPath,
            limit: 20
        };

        if (ctx.query.marker) {
            params.marker = ctx.query.marker;
        }

        let result = await qnFeature.listAsync(params);
        let finalResult = {
            items: _handleListItems(result.items)
        };

        if (result.marker) {
            finalResult.marker = result.marker;
        }

        ctx.body = {
            code: 200,
            message: '',
            data: finalResult
        };
    },

    /**
     * 上传处理
     */
    upload: async(ctx, next) => {
        if ('POST' !== ctx.method) return await next();

        let file = _.get(ctx, 'request.body._files.file');
        let user = ctx.session.user;

        if (!file) {
            return ctx.body = {
                code: 400,
                message: '没有接收到上传的文件包'
            };
        }

        let actPath = _.chain(ctx).get('request.body.actPath').trimStart('/').value();

        if (!actPath) {
            return ctx.body = {
                code: 400,
                message: '请指定路径'
            };
        }

        await new FileApi().upload(file, actPath, user);

        return ctx.body = {
            code: 200,
            message: '处理完毕',
            data: {}
        };
    },

    /**
     * 单文件上传页面
     */
    singleFile: async(ctx) => {
        await ctx.render('/action/single_file_page', {domain: _.get(CDNCONFIG.main, 'origin')});
    },

    /**
     * 单文件上传处理
     */
    singleFileUpload: async(ctx, next) => {
        if ('POST' !== ctx.method) return await next();

        let file = _.get(ctx, 'request.body._files.file');
        let actPath = _.get(ctx, 'request.body.actPath') || 'uploads/' + moment();
        let cover = _.get(ctx, 'request.body.cover') === 'yes'; // 是否覆盖
        let filePath = path.join(actPath, _.get(file, 'name'));

        if (!file) {
            return ctx.body = {
                code: 400,
                message: '没有接收到上传的文件'
            };
        }

        let readable = fs.createReadStream(file.path);
        let config = _.cloneDeep(CDNCONFIG.main);

        if (cover) {
            _.assign(config, {
                key: filePath
            });
        }

        let qnMain = require('../../../lib/qiniu')(config);
        let upResult = await qnMain.uploadAsync(readable, {key: filePath});

        if (upResult && upResult.url) {
            return ctx.body = {
                code: 200,
                message: '上传完毕',
                data: {
                    url: upResult.url
                }
            };
        } else {
            return ctx.body = {
                code: 400,
                message: '上传失败,请重试'
            };
        }
    }
}

router.get('/page', file.page);
router.get('/listlogs', file.listLogs);
router.get('/listfiles', file.listFiles);
router.post('/upload', file.upload);
router.get('/single-file', file.singleFile);
router.post('/single-file-upload', file.singleFileUpload);

module.exports = router;