当前位置: 首页 > article >正文

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

目录结构

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/xxxx
    console.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, // 用来存储图片的URL
    createdAt: { 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.kler.cn/a/443732.html

相关文章:

  • 【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101错误
  • Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器
  • 【机器学习】探索机器学习与人工智能:驱动未来创新的关键技术
  • 【pycharm】远程服务器之后如何打开终端
  • Unity 6 Preview(预览版)新增功能
  • ubuntu22.04 nginx配置下载目录,亲测成功
  • 单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
  • Webpack学习笔记(2)
  • 智慧公交指挥中枢,数据可视化 BI 驾驶舱
  • 【操作系统】数据集合集!
  • 数电课设·简易数字钟(Quartus Ⅱ)
  • 【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现
  • 多个图片转换为PDF文件
  • 时空AI赋能低空智能科技创新
  • IAR中如何而将定义的数组放在指定的位置
  • 【硬件IIC】stm32单片机利用硬件IIC驱动OLED屏幕
  • C05S09-Keepalive服务架设
  • pytest 小技巧:非测试方法如何使用 pytest fixture
  • 笔记--(Shell脚本04)、循环语句与函数
  • 多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用
  • Midjourney教程之生成同一角色的不同姿势和服装
  • Docker 容器网络问题排查与最佳实践 - PushGateway 部署案例分析
  • 详细分析:AG32 MCU与STM32/GD32的区别
  • Android 折叠屏问题解决 - 展开后布局未撑开
  • 【图像配准】方法总结
  • HarmonyOS NEXT 应用开发实战:音乐播放器的完整实现