node.js需要使用koa-multer库来实现上传图片接口。
实际上先通过koa-multer下载到本地指定目录,然后上传到阿里云(部分格式图片需要转换成网络格式图片jgp再上传)。
首先在系统启动文件引入注册路由:
1app.use(BodyParser({ 2 'formLimit':'3mb', 3 'jsonLimit':'3mb', 4 'textLimit':'3mb' 5})); 6// 注意顺序,必须body parser在前, router在后 7app.use(router.routes()); 8 9// 1. 注册基础路由 注意顺序,必须body parser在前, router在后 10const routes = require('./app/routes/index.js'); 11app.use(routes.routes()); 12app.use(routes.allowedMethods()); 13 14// 2. 初始化Main路由 15const Main = require('./app/main_erp.js'); 16Main.init(router); 17 18// 3. 将Main路由注册到Koa应用 19app.use(router.routes()); 20app.use(router.allowedMethods()); 21
注意:3. 将Main路由注册到Koa应用不能省,不然无法接收到接口传递过来的文件。
具体的图片的下载和上传代码:
1const ImageTool = require('@app/tools/image_tool.js'); 2var Main = {}; 3 4// 处理图片 5const fs = require('fs'); 6const path = require('path'); 7 8// 上传处理 9const Multer = require('koa-multer'); 10const IMAGE_PATH = 'upload/image'; 11// 存储位置 12let image_storage = Multer.diskStorage({ 13 destination: function (req, file, cb) { 14 cb(null, IMAGE_PATH); 15 }, 16 filename: function (req, file, cb) { 17 //cb(null, Date.now() + '_' + makeid(6) + path.extname(file.originalname)); 18 cb(null, file.originalname); 19 } 20}); 21const ImageUploader = Multer({ 22 storage: image_storage, 23 limits: { 24 fileSize: 50 * 1024 * 1024 // 50MB限制 25 } 26}); 27 28async function dealImg(ctx) { 29 // 获取文件扩展名 30 const fileExt = path.extname(ctx.req.file.originalname).toLowerCase(); 31 32 // 支持的格式,直接上传原文件 33 const readStream = fs.createReadStream(ctx.req.file.path); 34 let arr = ctx.req.file.path.split('/'); 35 let filename = '/img/' + arr[arr.length - 1]; 36 //上传图片到阿里云 37 return ImageTool.uploadImage(filename, fileExt, readStream, null, ctx.req.file.path); 38} 39 40/** 41 * 路由 42 * @param {*} router 43 */ 44function createRouteMap(router) { 45 // 图片上传接口 46 // 特殊接口,由于依赖Muler, 必须单独定义 47 router.post('/api/uploadImage', ImageUploader.single('pic'), async (ctx, next) => { 48 ctx.body = await dealImg(ctx); 49 }); 50} 51 52Main.init = function(router) { 53 console.log('Main'); 54 // console.log('router:', router); 55 createRouteMap(router); 56}; 57 58module.exports = Main; 59
《node.js上传图片接口》 是转载文章,点击查看原文。