node.js上传图片接口
node.js需要使用koa-multer库来实现上传图片接口。
实际上先通过koa-multer下载到本地指定目录,然后上传到阿里云(部分格式图片需要转换成网络格式图片jgp再上传)。
首先在系统启动文件引入注册路由:
app.use(BodyParser({'formLimit':'3mb','jsonLimit':'3mb','textLimit':'3mb'
}));
// 注意顺序,必须body parser在前, router在后
app.use(router.routes());// 1. 注册基础路由 注意顺序,必须body parser在前, router在后
const routes = require('./app/routes/index.js');
app.use(routes.routes());
app.use(routes.allowedMethods());// 2. 初始化Main路由
const Main = require('./app/main_erp.js');
Main.init(router);// 3. 将Main路由注册到Koa应用
app.use(router.routes());
app.use(router.allowedMethods());
注意:3. 将Main路由注册到Koa应用不能省,不然无法接收到接口传递过来的文件。
具体的图片的下载和上传代码:
const ImageTool = require('@app/tools/image_tool.js');
var Main = {};// 处理图片
const fs = require('fs');
const path = require('path');// 上传处理
const Multer = require('koa-multer');
const IMAGE_PATH = 'upload/image';
// 存储位置
let image_storage = Multer.diskStorage({destination: function (req, file, cb) {cb(null, IMAGE_PATH);},filename: function (req, file, cb) {//cb(null, Date.now() + '_' + makeid(6) + path.extname(file.originalname));cb(null, file.originalname);}
});
const ImageUploader = Multer({storage: image_storage,limits: {fileSize: 50 * 1024 * 1024 // 50MB限制}
});async function dealImg(ctx) {// 获取文件扩展名const fileExt = path.extname(ctx.req.file.originalname).toLowerCase();// 支持的格式,直接上传原文件const readStream = fs.createReadStream(ctx.req.file.path);let arr = ctx.req.file.path.split('/');let filename = '/img/' + arr[arr.length - 1];//上传图片到阿里云return ImageTool.uploadImage(filename, fileExt, readStream, null, ctx.req.file.path);
}/*** 路由* @param {*} router */
function createRouteMap(router) {// 图片上传接口// 特殊接口,由于依赖Muler, 必须单独定义router.post('/api/uploadImage', ImageUploader.single('pic'), async (ctx, next) => {ctx.body = await dealImg(ctx);});
}Main.init = function(router) {console.log('Main');// console.log('router:', router);createRouteMap(router);
};module.exports = Main;