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;
相关推荐
键盘会跳舞6 分钟前
C++:std::pair 源码级深度剖析 —— 关联容器的基石
开发语言·c++·pair·关联容器
(Charon)9 分钟前
【C++】手写线程安全队列:mutex + condition_variable 实现生产者消费者模型
c语言·开发语言·c++
崖边看雾16 分钟前
同步上下文管理器规则
开发语言·数据库
名字还没想好☜9 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
谢小飞12 小时前
大文件上传很难?学会这招,GB文件秒传不是梦
前端·node.js
一壶浊酒..12 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光13 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光13 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人13 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
在世修行15 小时前
从零打造 C# 工业视觉检测系统(七):串口通信 SerialPort 封装与开发
开发语言·c#·modbus rtu·rs232/rs485