フロントエンドクライアント
- axiosパッケージへの依存が必要,
npm i axios --save
- nodeJsはフロントエンドインターフェースのプロキシしかしません。
/**
* フロントエンドのリクエスト関数をラップする
*/
const upload = async (data) => {
const response = await axios
.post('/upload', data, {
maxContentLength: ,
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);
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);
};