前端客户端
- 需要依赖包axios,
npm i axios --save - nodeJs只做前端接口代理,请求函数中的params对象api属性为真正的后端接口
/**
* 封装前端请求函数
*/
const upload = async (data) => {
const response = await axios
.post('/upload', data, {
maxContentLength: 1024 * 10,
params: {
api: '/api/upload',
},
headers: {
'Content-Type': 'multipart/form-data',
},
withCredentials: true,
})
.then((res) => res.data)
.catch((err) => {
showErrorMessage(err);
});
// 通用的判断请求是否成功的函数
if (isSuccess(response)) {
return response.data;
} else {
message.error(`上传操作异常: ${response.error_desc}`);
return null;
}
}
const handleOkUpload = async (file) => {
const formData = new FormData();
formData.append('file', file); // file为要上传的文件数据流
// 调用上传ajax函数
const resData = await upload(formData);
if(resData){
// do somesing
}
}
NodeJs端
- 需要依赖包request-promise,
npm i request-promise --save
config/config.default.js添加配置
config.multipart = {
mode: 'file',
fileSize: '10mb',
fileExtensions: ['.xlsx', '.xls'],
};
app/controller/upload.js 上传接口
const { Controller } = require('egg');
const rp = require('request-promise');
const fs = require('fs');
const qs = require('querystring');
/**
* 上传接口
*/
class UploadController extends Controller {
async index() {
const { ctx, config } = this;
// 从配置文件中读取不同环境下的请求根域名与超时时间的配置
const { noahApiServer, requestTimeout } = config;
const { apihost } = noahApiServer;
const { request } = ctx;
const { body, files, query } = request;
const { case_id, tag_id } = body;
const { api } = query;
const file = files[0];
const { filepath, filename } = file;
const url = `${apihost}${api}`;
const requestURI = `${url}?${qs.stringify(query)}`;
try {
ctx.logger.info('上传接口:', requestURI);
ctx.logger.info('上传接口body参数:', body);
const result = await rp({
uri: requestURI,
method: 'POST',
formData: {
case_id,
tag_id,
file: {
value: fs.createReadStream(filepath),
options: {
filename,
contentType: ctx.get('content-type'),
},
},
},
json: true,
timeout: requestTimeout,
});
ctx.body = result;
} catch (err) {
ctx.logger.info('Excel上传失败:', err.message);
ctx.body = {
cost: 1001,
error_desc: `server error: ${err.message}`,
result_code: 'FAIL',
time: Date.now(),
};
}
}
}
module.exports = UploadController;
app/router.js 接口挂载
module.exports = (app) => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.post('/upload', controller.upload.index);
};