koa实现图片上传接口(本地生成)

embedded/2024/12/19 19:42:44/

目录结构

my-koa-app/
├── config/               # 配置文件夹
│   └── database.js       # 数据库连接配置
├── controllers/          # 控制器,包含具体的业务逻辑
│   └── uploadImageController.js # 用户相关的控制器
├── models/               # Mongoose 数据模型
│   └── uploadImage.js           # 用户模型
├── routes/               # 路由定义
│   └── routes.js     # 用户相关路由
├── uploads/               # 上传图片目录
├── app.js                # Koa 应用的入口文件
└── package.json          # 项目配置文件

安装npm包

npm install koa koa-router koa-bodyparser mongoose koa-static koa-multer

代码示例

app.js

const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const connectDB = require('./config/database');
const koaStatic = require('koa-static');
const userRoutes = require('./routes/routes');//引入路由
const path = require('path');// 连接到数据库
connectDB();const app = new Koa();// 使用 bodyParser 解析请求体
app.use(bodyParser());// 静态文件服务
app.use(koaStatic(path.join(__dirname, 'uploads'))); // 提供上传文件的静态资源服务// 加载 user 路由
app.use(userRoutes.routes()); // 使用 userRoutes 路由
app.use(userRoutes.allowedMethods()); // 使用 allowedMethods// 启动服务器
app.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});

config/database.js

// config/database.js
const mongoose = require('mongoose');const connectDB = async () => {try {await mongoose.connect('mongodb://localhost:端口号/数据库名称');//例如:mongodb://localhost:27017/xxxxconsole.log('MongoDB connected');} catch (err) {console.error(err);}
};module.exports = connectDB;

models/uploadImage.js

const mongoose = require('mongoose');
// 创建图片存储的 Schema 和 Model
const ImgSchema = new mongoose.Schema({filename: String,//文件名称path: String,//文件目录url: String, // 用来存储图片的URLcreatedAt: { type: Date, default: Date.now },//创建时间});const photoImg = mongoose.model('photoImg', ImgSchema);module.exports = photoImg;

controllers/uploadImageController.js

const multer = require('@koa/multer');
const path = require('path');
const photoImg = require('../models/uploadImage');  // 引用正确的模型// 配置上传目录,确保 uploads 目录存在
const upload = multer({dest: path.join(__dirname, '/../uploads/'),  // 上传的文件存储路径limits: { fileSize: 5 * 1024 * 1024 }, // 限制文件大小为 5MB
});// 上传图片接口的逻辑
const uploadImage = async (ctx) => {const { file } = ctx.request;  // 获取上传的文件console.log('File:', file);  // 打印文件信息if (!file) {ctx.status = 400;ctx.body = { error: 'No file uploaded' };  // 如果没有文件上传return;}const imageUrl = `http://localhost:3000/uploads/${file.filename}`; // 图片的 URL 地址// 保存文件信息到数据库const newPhoto = new photoImg({filename: file.originalname,path: file.path,url: imageUrl,});try {await newPhoto.save();ctx.status = 201;ctx.body = { success: true, url: imageUrl }; // 返回图片的 URL} catch (err) {ctx.status = 500;ctx.body = { error: 'Failed to save image', details: err.message };}};// 获取所有图片信息
const getPhotos = async (ctx) => {try {const photos = await photoImg.find(); // 查询所有图片ctx.body = { success: true, data: photos };} catch (err) {ctx.status = 500;ctx.body = { error: 'Failed to fetch photos' };}
};// 获取指定 ID 的图片信息
const getPhotoById = async (ctx) => {const { id } = ctx.params;try {const photo = await photoImg.findById(id); // 根据 ID 查找图片if (!photo) {ctx.status = 404;ctx.body = { success: false, message: 'Photo not found' };} else {ctx.status = 200;ctx.body = { success: true, data: photo };}} catch (err) {ctx.status = 500;ctx.body = { success: false, message: 'Network error' };}
};module.exports = {uploadImage,getPhotos,getPhotoById,upload,  // 导出上传中间件
};

routes/routes.js

// routes/routes.js
const Router = require('koa-router');const  imgController = require('../controllers/uploadImageController')const router = new Router();// 图片上传接口// 定义 Post 请求 - 获取用户信息
router.post('/upload', imgController.upload.single('image'), imgController.uploadImage);// 定义 GET 请求 - 获取所有图片
router.get('/photos', imgController.getPhotos);// 定义 GET 请求 -  获取指定 ID 的图片
router.get('/photos/:id', imgController.getPhotoById);module.exports = router;

测试

发起postman请求,参数为image,格式类型为file
在这里插入图片描述
本地上传file打印结果:
在这里插入图片描述

请求前uploads目录为空
在这里插入图片描述

请求成功后uploads添加成功数据
在这里插入图片描述
在这里插入图片描述
查看数据库path,url目录保存图片,是否访问成功
在这里插入图片描述


http://www.ppmy.cn/embedded/147089.html

相关文章

django——admin后台管理1

一、admin后台管理 访问url进入: http://127.0.0.1:8000/admin ​ 创建超级管理用户 终端输入以下命令: python manage.py createsuperuser (py36_pingping) E:\django学习\day03-django入门\demo>python manage.py createsuperuser Username: mo…

XXE-Lab for PHP

进入环境 出现一个登录页面,输入任意 UserName 和 Psaaword ,使用bp抓取登录数据包 发送到重放器,点击“发送” 只修改 username 的值,查看右边的变化 只修改 password 的值,查看右边的变化 修改 username 和 password…

springboot中Controller内文件上传到本地以及阿里云

上传文件的基本操作 <form action"/upload" method"post" enctype"multipart/form-data"> <h1>登录</h1> 姓名&#xff1a;<input type"text" name"username" required><br> 年龄&#xf…

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …

无人机故障安全模式设计逻辑与技术!

一、设计逻辑 故障检测与识别&#xff1a; 无人机系统需具备实时监测各项关键参数的能力&#xff0c;如电池电量、电机状态、传感器数据等。 当检测到参数异常或超出预设阈值时&#xff0c;系统应能迅速识别故障类型及其严重程度。 故障处理策略&#xff1a; 根据故障类型…

SSM 构建基石,Vue 添彩助力:新锐台球厅管理系统的设计与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

主流webgl 引擎 glsl 如何升级webgpu为 wgsl?

0、背景 SPIR-V、GLSL 和 WGSL 是三种不同的着色语言或中间表示形式&#xff0c;它们在现代图形编程中的关系如下&#xff1a; 1、playcanvas 方案: glsl 转 SPIR-V 转 wgsl 调研版本: "version": "2.4.0-dev"webgpu-shader.js transpile(src, shader…

Halcon中histo_2dim(Operator)算子原理及应用详解

在Halcon中&#xff0c;histo_2dim算子是一个用于计算双通道灰度值图像的直方图的工具。以下是对该算子的原理及应用的详细解释&#xff1a; 一、原理 histo_2dim算子的函数原型为&#xff1a;histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )。 输入参数&#xff…