Koa2文件上传

1.Koa2文件提交

首先引入 koa-multer
定义中间件:upload = multer({dest:定义路径})
在路由中引入:

app.post('/addgoods' , uploadimg.any() ,async(ctx)=>{})

如果用form表单提交 必须要添加:

enctype="multipart/form-data"

从form表单提交的file文件会缓存到public中的 upload定义的路径中;
例如:

upload = multer({ dest:"/upload"});

依据 “.”打断、并获取上传文件名

let filename = (file.originalname).split(".");
let fileN = filename[filename.length - 1];

2.文件存储

按照日期定义存储文件位置
先引入 moment(查询时间)、path(合成路径)模块

var date = moment().format("Y-M-D");//生成当前日期 例如:2017-01-10
var dest = path.normalize(path.join( 定义目录, date));//定义要存储的目录

按照日期创建文件夹

 fs.mkdir("datas/uploads/"+moment().format("Y-M-D"),function(err){console.log(err)}); //根据日期创建文件夹

获取到缓存的上传文件,将缓存转为保存。

let filepath = path.join( 缓存文件的路径, file.path); //得到当前缓存图片的绝对路径
let destfile = path.join(dest, file.filename+ "." + fileN);     //得到你要保存图片的绝对路径
fs.createReadStream(filepath).pipe(fs.createWriteStream(destfile));   //将缓存变为保存的方法

3.删除缓存文件

fs.unlink(filepath, async (ctx, next) => {}) //unlink()删除文件

4.将文件路径存入数据库

先将完整的存储路径依据,“根目录”打断。

5.完整代码

imgurl = destfile;
let ss = imgurl.split('根目录\\');//保存图片的相对路径    
ss[1] = ss[1].replace("\\", "/");//将所有 \\ 转换成 /

然后存储进数据库,需要时就可以直接引用了。

post_file : {
        opts: {
        middleware : uploadimg.any()
        },
        async handler(ctx,next) {
            let imgurl;
            let file = ctx.req.files;
            fs.mkdir("datas/uploads/"+moment().format("Y-M-D"),function(err){console.log(err)}); //根据日期创建文件夹
            for (let file of ctx.req.files) {      //将req.files中的所有属性遍历出来  
                let filename = (file.originalname).split(".");
                let fileN = filename[filename.length - 1];
                let filepath = path.join(__dirname,  "..","..", file.path); //得到当前缓存图片的绝对路径
                let destfile = path.join(dest, file.filename+ "." + fileN);     //得到你要保存图片的绝对路径
                // file.filename  --当前保存的文件名
                fs.createReadStream(filepath).pipe(fs.createWriteStream(destfile));   //将缓存变为保存的方法
                //删除文件名
                fs.unlink(filepath, async (ctx, next) => {    //把之前的缓存删除
                    console.log(">>>>>>>>", 'Remove filepath Success');
                })
                imgurl = destfile;
                let ss = imgurl.split('LoginSystem\\');    //保存图片的相对路径    绝对与相对!!!
                ss[1] = ss[1].replace("\\", "/");         
                let onefile = mongoose.model('File');
                let oid = ctx.session.user.id;
                let pubname = ctx.session.user.username;
                let obj = ctx.req.body;
                let newfile = new onefile({
                    uid : oid,
                    url : ss[1],
                    pubname : pubname,
                    owner : obj.sce,
                    filename : obj.name,
                    mimeType : fileN,
                    pubdate : Date.now()
                })
                await newfile.save();
                console.log(">>>>>>>>>>>>success<<<<<<<<<<<<<<");
            }
            ctx.body = "上传成功";
        }
    },

你可能感兴趣的:(Koa2文件上传)