koa使用koa-body上传文件

#其它  27天前   阅读/54

cdn有点费,换上传图片到数据库,想的是通过文件id get获取到图片直接显示

上传文件返回id
查看图片

需求

  1. 上传文件到服务器存在当天的日期(年月日)文件夹里面
  2. 【文件部分不变地址】放到数据库 方便后面更换服务器
  3. 读取的时候通过id查询到路径在读取文件返回 方便后面加权限、获取图片大小等

一、下载koa-body

npm install koa-body --save

二、在项目中引入

const Koa = require('koa'); const koaBody = require('koa-body'); const app = new Koa(); app.use(koaBody({ multipart: true, // 开启文件上传 formidable: { maxFileSize: 50*1024*1024, // 设置上传文件大小最大限制,默认2M keepExtensions: true // 保留文件拓展名 } }))

主要操作

1.koa-body 4.0以上 通过ctx.request.files.file;得到文件如果是多个就返回的是数组一个就是对象
2.通过fs保存文件

// 读取文件流 fileReader = fs.createReadStream(f1.path); // 最终要保存到的文件夹目录 const dir = path.join(__dirname, `${pathQz}${uloadDirName}`); // 检查文件夹是否存在如果不存在则新建文件夹 checkDirExist(dir); // 组装路径 fileResource = dir + `/${fileNamePath}`; // 创建可写流 writeStream = fs.createWriteStream(fileResource); // 可读流通过管道写入可写流 fileReader.pipe(writeStream);

3.读取文件 用的fsreadFileSync

file = fs.readFileSync(filePath); //读取文件 filePath文件路径

上传文件和读取接口完整代码

1.const { sequelize } = require(’…/common/dbs’) 这个是链接数据库操作
2.const fileModel = require("…/models/xqt_file")这个是文件表的model

const router = require('koa-router')(); var fs = require("fs"); const path = require('path'); const util = require("../common/utils") const mime = require('mime-types'); //需npm安装 const { sequelize } = require('../common/dbs') const fileModel = require("../models/xqt_file") const fileinfo = fileModel(sequelize); // 默认图地址 const defaultImg = '../public/default.jpg' // 路径前缀 const pathQz = '../public/upload/' router.post('/upload', async (ctx, next) => { try { var files = ctx.request.files.file; // 单个文件变成数组 if (files.length === undefined) { files = [files] } // 需要添加到数据库的数据 var fileDatas = [] // 获取目录文件夹名字 var uloadDirName = getUploadDirName(); // 遍历文件 for (var i = 0; i < files.length; i++) { const f1 = files[i]; // 随机文件名 var fileName = getuuid(); // 获取文件后缀 let ext = f1.name.split('.'); var fileNamePath = getuuid() + "." + ext[ext.length - 1]; // 添加数据库的数据 fileDatas.push({ filename: `${uloadDirName}/${fileNamePath}`, fileid: fileName }); // 读取文件流 fileReader = fs.createReadStream(f1.path); // 最终要保存到的文件夹目录 const dir = path.join(__dirname, `${pathQz}${uloadDirName}`); // 检查文件夹是否存在如果不存在则新建文件夹 checkDirExist(dir); // 组装路径 fileResource = dir + `/${fileNamePath}`; // 创建可写流 writeStream = fs.createWriteStream(fileResource); // 可读流通过管道写入可写流 fileReader.pipe(writeStream); } // 批量添加 var requestData = await fileinfo.bulkCreate(fileDatas) if (requestData.length == files.length) { // 得到id拼接数组 var resultIds = requestData.map(item => { return item.fileid }) ctx.body = util.resultSuccess({ message: '上传成功', data: { fileid: resultIds.toString() } }); } else { ctx.body = util.resultSuccess({ code: 0, message: '上传失败', data: null }); } } catch (error) { console.log(error) ctx.body = util.resultError({ code: 0, message: '上传失败', data: error }); } }); // 读取文件 router.get('/file', async (ctx, next) => { var filePath = null; var file = null; try { var reqQuery = ctx.request.query; // 查询数据库 var cardData = await fileinfo.findOne( { attributes: { // exclude排除 exclude: ['id', 'devaredAt'], }, where: { // 条件 fileid: reqQuery.fileid } } ); if (cardData) { const name = cardData.filename; // 拼接路径 const pathName = `${pathQz}${name}`; filePath = path.join(__dirname, pathName); //完整图片地址 showFile(ctx, filePath); } else { ctx.body = util.resultError({ code: 0, message: err.message, data: null }); } } catch (error) { //如果服务器不存在请求的图片,返回默认图片 filePath = path.join(__dirname, defaultImg); //默认图片地址 showFile(ctx, filePath); } }); // 显示图片 function showFile(ctx, filePath) { try { file = fs.readFileSync(filePath); //读取文件 } catch (error) { //如果服务器不存在请求的图片,返回默认图片 filePath = path.join(__dirname, defaultImg); //默认图片地址 file = fs.readFileSync(filePath); //读取文件 } var mimeType = mime.lookup(filePath); //读取图片文件类型 ctx.set('content-type', mimeType); //设置返回类型 ctx.body = file; //返回图片 } //检查文件夹是否存在 function checkDirExist(p) { if (!fs.existsSync(p)) { fs.mkdirSync(p); } } // 文件夹名字 function getUploadDirName() { const date = new Date(); var month = Number.parseInt(date.getMonth()) + 1; month = month.toString().length > 1 ? month : `0${month}`; const dir = `${date.getFullYear()}${month}${date.getDate()}`; return dir; } // 随机id function getuuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); var uuid = s.join(""); return uuid; } module.exports = router.routes();

接触node.js不久 特纪录下来
参考链接【NodeJS】NodeJs koa2实现文件上传

元芳,你怎么看?
加载中