nodejs可以有很多种方式进行上传文件,这次我的是使用express实现比较简单的图片上传。
uploads 上传图片的文件夹 public 放置静态的文件 views 渲染的页面文件
controller/router.js 上传图片逻辑文件
1. 新建app.js,编写相关逻辑
let express = require('express')
let app = express()
let router = require('./controller/router') // 对于路由展示的逻辑我写在了controller里面
app.set("view engine", "ejs") // 模板引擎这里使用的是ejs
app.use(express.static("./public")) // 路由中间件,静态页面,这里放css,js之类的
app.use(express.static('./uploads')) // 这里是上传文件的文件夹
app.get("/up", router.showUp); // 上传图片页面
app.post("/up", router.doPost)
app.listen(3000)复制代码
2. 上传图片页面 views/up.ejs [node会自动查找views下面对应的页面]
<form method="post" action="#" enctype="multipart/form-data">
// 默认提交到当前页面 post方式
<label for="exampleInputFile">选择图片</label>
<p>尺寸小于1M</p> <input type="file" id="exampleInputFile" name="tupian">
<button type="submit">上传</button>
</form>复制代码
3. 编写上传图片逻辑 controller/router.js
let formidable = require("formidable");
let path = require("path");
let fs = require("fs");
let sd = require("silly-datetime");
exports.showUp = (req,res) => {
res.render("up")
}
exports.doPost = (req,res) => {
let form = new formidable.IncomingForm();
// tempup文件夹是临时文件夹,暂时存放上传的文件图片
form.uploadDir = path.normalize(__dirname, + "/../tempup/")
form.parse(req, (err, fields, files, next) => {
if(err) {
next();
return;
}
let size = parseInt(files.tupian.size); // 判断当前上传图片大小
if(size > 1 * 1024 * 1024){
res.send("图片尺寸应该小于1M");
fs.unlink(files.tupian.path); // 超于文件规定的大小 那么对上传文件的进行删除
return;
}
let ttt = sd.format(new Date(), 'YYYYMMDDHHmmss');
let ran = parseInt(Math.random() * 89999 + 10000);
let extname = path.extname(files.tupian.name); // 用时间戳随机数加上拓展名
let wenjianjia = fields.wenjianjia; // 当前上传的文件夹名称
let oldpath = files.tupian.path;
// 给图片更改统一格式的名称
let newpath = path.normalize(__dirname + "/../uploads/"+ wenjianjia + "/" +ttt +ran + extname);
fs.rename(oldpath,newpath,(err) => { // 将文件移动到要上传的文件夹上面 if(err){ res.send("改名失败"); return; } res.send("bingo"); }); })
}复制代码
4. 这样就完成了简单的图片上传。