koa-multer接收上传的文件,md5名称保存
两个版本:
1. 由这个中间件直接把文件保存到本地,返回文件路径
使用场景:短时间使用,文件丢失、重复不重要时候用
2. 自己保存文件内容,这样可以以md5保存名称,不怕文件重复
使用场景:长时间用
安装:
cnpm i koa-multer --save
第一版本(直接保存至本地版本):
// 注:只有关键代码
配置:
const multer = require('koa-multer')
let storage = multer.diskStorage({
destination: function (req, file, cb) {
// 保存到指定得目录,通过fieldname(formData的key值)来区分文件要保存到服务器哪个目录中
console.log('fieldname', file)
if(file.fieldname == "file"){
cb(null, 'static/upload/file');
}else if(file.fieldname == "image"){
cb(null, 'static/upload/image');
}else if(file.fieldname == "avatar"){
cb(null, 'static/upload/avatar');
}
},
filename: function (req, file, cb) {
// 自定义本地保存得文件名称
// file.originalname是客户端那边的文件名称
// 这边保存的自定义名称,路由那边是可以获取到的
let filename = "test_"+file.originalname;
cb(null, filename)
}
})
let uploadFile = multer({ storage: storage })
路由写法:
(1) 接收多文件版本
let {cookie_config, uploadFile} = require("../settings")
router.post('/upload/image/', uploadFile.any(), async (ctx, next)=>{
console.log("api", ctx.req.files)
res = {status: 0, message: "上传成功!"}
ctx.body = JSON.stringify(res)
})
返回的内容分析:
// originalname是客户端那边文件名称
// fieldname是formData里key的名称
// filename是保存在服务端的名称,这个名称由配置文件那边可以修改了传过来
[ { fieldname: 'image',
originalname: 'bf096b63f6246b60597e7435ebf81a4c510fa27b.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'static/upload/image',
filename: 'test_bf096b63f6246b60597e7435ebf81a4c510fa27b.jpg',
path:
'static\\upload\\image\\test_bf096b63f6246b60597e7435ebf81a4c510fa27b.jpg',
size: 77754 },
{ fieldname: 'image',
originalname: 'Cache_-4480cc52e598992e..jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'static/upload/image',
filename: 'test_Cache_-4480cc52e598992e..jpg',
path: 'static\\upload\\image\\test_Cache_-4480cc52e598992e..jpg',
size: 283118 },
]
(2) 接收单文件版本
let {cookie_config, uploadFile } = require("../settings")
router.post('/upload/image/', uploadFile.single("image"), async (ctx, next)=>{
console.log("api", ctx.req.file)
res = {status: 0, message: "上传成功!"}
ctx.body = JSON.stringify(res)
})
第二版本(自己保存文件):
// 注:代码只有关键部分
配置:
const multer = require('koa-multer')
let storage = multer.memoryStorage()
let uploadFile = multer({ storage: storage })
路由写法:
(1) 多文件版本,以md5名称保存的文件
let { Op } = require("sequelize");
let fs=require("fs");
let path = require('path');
let router = require('koa-router')()
let model = require('../model/index')
let tools = require('../tools')
let {cookie_config, uploadFile, upload_image_dir} = require("../settings")
router.prefix('/api')
router.post('/upload/image/', uploadFile.any(), async (ctx, next)=>{
// md5文件内容是个费时的操作,一个2MB的文件获取md5多消耗了10倍时间
// 遇到一样的图片,目前是覆盖操作,由同名文件直接写入
console.log("api", ctx.req.files)
let res = {errno: 0, message: "上传成功!", data: []}
// 循环操作上传的文件列表
for (let file of ctx.req.files){
let filemd5 = tools.md5_filename(file.buffer)
let temp = file.originalname.split('.')
let filename = `${filemd5}.${temp[temp.length-1]}`
let filepath = path.join(upload_image_dir, filename)
// 保存文件
fs.writeFile(filepath, file.buffer, (err)=>{});
// 给前端文件访问路径
res.data.push({
url: `/${upload_image_dir}/${filename}`
})
}
ctx.body = JSON.stringify(res)
})
测试结果:

(2) 单文件版本
md5文件内容写法:


浙公网安备 33010602011771号