Authored by 毕凯

Merge branch 'feature/upsinglefile' into 'master'

Feature/upsinglefile



See merge request !17
'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 CDNCONFIG = require('../../../config/cdn_config');
const qn = require('../../../lib/qiniu')(CDNCONFIG.feature);
const qnFeature = require('../../../lib/qiniu')(CDNCONFIG.feature);
/**
* 处理列表数据
... ... @@ -18,25 +20,18 @@ const _handleListItems = items => {
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;
perFile.link = _.get(CDNCONFIG.feature, 'origin') + '/' + perFile.key;
});
return items;
};
/**
* 校验是否是允许上传的文件包
*/
const _verifyFiles = filesList => {
return true;
};
const file = {
/**
* 文件管理页面
*/
page: async(ctx) => {
await ctx.render('/action/file_page', {domain: _.get(CDNCONFIG, 'feature.origin')});
await ctx.render('/action/file_page', {domain: _.get(CDNCONFIG.feature, 'origin')});
},
/**
... ... @@ -68,7 +63,7 @@ const file = {
params.marker = ctx.query.marker;
}
let result = await qn.listAsync(params);
let result = await qnFeature.listAsync(params);
let finalResult = {
items: _handleListItems(result.items)
};
... ... @@ -116,6 +111,59 @@ const file = {
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 = CDNCONFIG.main;
if (cover) {
_.assign(CDNCONFIG.main, {
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: '上传失败,请重试'
};
}
}
}
... ... @@ -123,5 +171,7 @@ 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;
... ...
... ... @@ -79,6 +79,9 @@
if (!$('#actPath').val()) {
$('.logs').prepend('<p>state: 请输入上传地址!</p>');
return false;
} else {
$(this).attr('disabled', 'disabled');
$(this).text('上传中...');
}
actPath = `/${actPath}`;
formData.append('file', file);
... ... @@ -98,8 +101,12 @@
$('#upload-list tr[class!=title]').remove();
page = 1;
getList();
$('#upload').removeAttr('disabled');
$('#upload').text('上传');
} else if (result.code === 400) {
$('.logs').prepend('<p>state: 请选择上传文件!</p>');
$('#upload').removeAttr('disabled');
$('#upload').text('上传');
}
} else {
$('.logs').prepend('<p>state: 请稍后再试!</p>');
... ... @@ -125,7 +132,7 @@
result.data.forEach(function(item){
$uploadList.append(`
<tr>
<td><a href="${item.link}">${item.actPath}</a></td>
<td><a target="_blank" href="${item.link}">${item.actPath}</a></td>
<td style="text-align:center;">${item.fileName}</td>
<td style="text-align:center;">${item.date}</td>
<td style="text-align:center;">${item.username}</td>
... ... @@ -180,7 +187,7 @@
$this.parents('td').find('.get-more').attr('data-marker', result.data.marker);
result.data.items.forEach(function(item){
detail += `<tr class="detail-list">
<td><a href="${item.link}">${item.key}</a></td>
<td><a target="_blank" href="${item.link}">${item.key}</a></td>
<td style="text-align:center;">${item.fsizekb}</td>
<td style="text-align:center;">${item.mimeType}</td>
<td style="text-align:center;">${item.putTimeFormat}</td>
... ...
<div class="pageheader">
<div class="media">
<div class="pageicon pull-left">
<i class="fa fa-th-list"></i>
</div>
<div class="media-body">
<ul class="breadcrumb">
<li><a href=""><i class="glyphicon glyphicon-home"></i></a></li>
<li>静态资源</li>
</ul>
<h4>单文件上传</h4>
</div>
</div>
<!-- media -->
</div>
<!-- pageheader -->
<div class="contentpanel">
<div class="form">
<div class="form-group">
<label for=""></label>
<div class="input-group">
<span class="input-group-addon">{{domain}}/</span>
<input type="text" class="form-control" id="actPath" aria-describedby="basic-addon3" placeholder="请输入文件路径,例:20171030/v2.4.8">
</div>
</div>
<div class="form-group">
<label for="file">选择文件</label>
<input type="file" class="form-control" name="file" id="fileInput">
</div>
<input type="hidden" id="cover" name="cover">
<div class="form-group">
<button class="btn btn-default" id="upLoadBtn">上传</button>
<span id="resultMsg"></span>
</div>
</div>
</div>
<script>
$('#upLoadBtn').on('click', function(){
$('#upLoadBtn').attr('disabled', 'disabled');
var file = $('#fileInput').prop('files')[0];
var actPath = $('#actPath').val();
var formData = new FormData();
var cover = $('#cover').val();
formData.append('file', file);
formData.append('actPath', actPath);
formData.append('cover', cover);
$.ajax({
type: 'POST',
url: '/files/single-file-upload',
cache: false,
data: formData,
dataType: 'json',
processData: false,
contentType: false,
complete: function() {
$('#upLoadBtn').removeAttr('disabled');
},
success: function(result) {
if (result.code === 200) {
$('#resultMsg').html(`<a target="_blank" href="${result.data.url}">${result.data.url}</a>`);
} else {
$('#resultMsg').html(result.message);
}
}
});
});
</script>
\ No newline at end of file
... ...
... ... @@ -65,6 +65,7 @@
<ul class="children">
<li><a href="/check/list">代码检查</a></li>
<li><a href="/files/page">活动上传</a></li>
<li><a href="/files/single-file">单文件上传</a></li>
</ul>
</li>
... ...
... ... @@ -3,6 +3,13 @@
*/
const CDNCONFIG = {
main: {
accessKey: 'cY9B5ZgON_7McTS5zV5nTeRyQ98MOcVD7W4eGVbE',
secretKey: 'RduqgmK7cAtaQvdIa1ax_zzmMsnv9ac-Ka0uF6wG',
origin: 'https://cdn.yoho.cn',
bucket: 'yohocdn'
},
feature: {
origin: 'https://feature.yoho.cn',
bucket: 'yohogirlzine'
... ...
... ... @@ -6,22 +6,21 @@
'use strict';
const CDNCONFIG = require('../config/cdn_config');
const qn = require('qn');
const Promise = require('bluebird');
const _ = require('lodash');
const config = {
accessKey: 'cY9B5ZgON_7McTS5zV5nTeRyQ98MOcVD7W4eGVbE',
secretKey: 'RduqgmK7cAtaQvdIa1ax_zzmMsnv9ac-Ka0uF6wG',
origin: 'http://cdn.yoho.cn',
bucket: 'yohocdn'
};
const _default = (params) => {
let finalConfig = config;
let finalConfig = _.cloneDeep(CDNCONFIG.main);
if (params) {
_.assign(finalConfig, params);
// 传 key 强制覆盖
if (params.key) {
finalConfig.bucket = params.bucket + ':' + params.key;
}
}
return Promise.promisifyAll(
... ... @@ -29,8 +28,11 @@ const _default = (params) => {
);
}
/**
* 兼容旧的强制覆盖逻辑,新功能开发弃用
*/
_default.key = function(key) {
let _conifg = _.clone(config);
let _conifg = _.clone(CDNCONFIG.main);
_conifg.bucket = _conifg.bucket + ":" + key;
return Promise.promisifyAll(qn.create(_conifg));
};
... ...
This diff could not be displayed because it is too large.