koa 图片上传详解

本文图片上传示例展示koa中间件框架基本流程,省去前端编码直接用 httpie 模拟文件上传测试

Koa

Koa 的中间件之间按照编码顺序在栈内依次执行(先进后出),允许您执行操作并向下传递请求(downstream),之后过滤并逆序返回响应(upstream)。前端人员可以将next() 之前的任意代码视为“捕获”阶段,下面这个 gif 说明了 async 函数如何恰当地利用堆栈流来实现请求和响应流。

koa 图片上传详解

当中间件(带有签名 (ctx, next) 的MiddlewareFunction)运行时,它必须手动调用 next() 来运行 “下游” 中间件。

Code

图片上传,需要指定上传路径(步骤5),web访问展示图片则要开启静态资源服务(步骤1)

const logger = require("koa-logger")
const serve = require("koa-static")
const koaBody = require("koa-body")
const Koa = require('koa')
const fs = require("fs")
const app = new Koa()
const os = require("os")
const path = require("path")

app.use(logger())
// 使用文件上传中间件
app.use(koaBody({ multipart: true }))

// 1.静态资源服务,指定对外提供访问的根目录
app.use(serve(path.join(__dirname, '/public')));

app.use(async function (ctx, next) {
    await next()
    if (ctx.body || !ctx.idempotent) return
    ctx.response.body = '<h1>Hello, koa2!</h1><p>not upload photo</p>'
})

// 2. 文件上传
app.use(async function (ctx, next) {
    if ('POST' != ctx.method) return await next()
    // 获取图片源
    //  <input type="file" name="file" multiple>
    const file = ctx.request.files.file
    // 接收读出流
    const reader = fs.createReadStream(file.path)
    // 创建写入流 
    // 3. 指定图片路径文件名(即上传图片存储目录)
    const stream = fs.createWriteStream(path.join('public/images', file.name))
    // 用管道将读出流 "倒给" 输入流
    reader.pipe(stream)
    // 4.打印上传文件在服器上存储的相对路径 
    console.log('uploading %s -> %s', file.name, stream.path)
    // 5.重定向到基于根目录下的静态资源web访问路径,展示图片
    ctx.redirect(stream.path.substr(6).replace(/\\/g,'/'))
})

// 监听
app.listen(3000, () => {
    console.log("listening port 3000");
})

Upload

项目基本结构

└─node_modules
├─public
	└─images
└─app.js

执行node app.js 启动服务器

listening port 3000

执行httpie 命令上传本地图片到服务器

koa 图片上传详解
服务端显示

  <-- POST /
uploading pipe.png -> public\images\pipe.png
  --> POST / 302 73ms 63b

查看服务器图片目录,与此同时前端可以通过localhost:3000/images/pipe.png url地址直接访问图片

koa 图片上传详解

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将图片上传到数据库,你需要执行以下步骤: 1. 配置数据库连接:首先,确保你已经安装并配置了适当的数据库驱动程序(如MySQL、MongoDB等)。在Koa应用程序的配置文件中,添加数据库连接的相关信息,包括主机名、端口号、用户名、密码等。 2. 创建数据库模型:使用ORM(对象关系映射)工具(如Sequelize、Mongoose等),创建与数据库表或集合对应的模型。在模型中定义存储图片的字段,如文件名、文件类型、文件路径等。 3. 设置路由和控制器:在Koa应用程序中设置一个用于接收上传图片的路由,并编写相应的控制器逻辑。在控制器中,使用适当的中间件(如koa-body、multer等)来处理文件上传,并将上传的图片保存到指定的目录。 4. 将图片信息存储到数据库:在控制器中,将上传的图片信息存储到数据库中。使用之前创建的数据库模型,在控制器中创建一个新的实例,并将上传的图片信息赋值给对应字段。然后调用保存(save)或创建(create)方法将图片信息持久化到数据库。 以下是一个简单的示例代码: ```javascript // 引入依赖 const Koa = require('koa'); const Router = require('koa-router'); const multer = require('@koa/multer'); const { createReadStream } = require('fs'); const { promisify } = require('util'); const pipeline = promisify(require('stream').pipeline); const { Image } = require('./models'); // 假设已经定义了Image模型 // 创建Koa应用程序和路由 const app = new Koa(); const router = new Router(); // 配置文件上传 const upload = multer({ dest: 'uploads/' }); // 设置图片上传路由和控制器 router.post('/upload', upload.single('image'), async (ctx) => { const { file } = ctx.req; // 将上传的图片保存到指定目录 await pipeline(createReadStream(file.path), createWriteStream(`uploads/${file.originalname}`)); // 将图片信息存储到数据库 await Image.create({ filename: file.originalname, filetype: file.mimetype, filepath: `uploads/${file.originalname}`, }); ctx.body = 'Image uploaded successfully!'; }); // 将路由挂载到应用程序 app.use(router.routes()).use(router.allowedMethods()); // 启动应用程序 app.listen(3000, () => { console.log('Server started on port 3000'); }); ``` 上述示例代码演示了如何使用Koa、Multer和Sequelize将图片上传到数据库。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值