记录关于node接受Markdown上传的base64图片问题
引入Markdown的操作不说了,可以借鉴这个 [vue使用Markdown](https://blog.csdn.net/yhy1315/article/details/98190327)
<mavon-editor v-model="content" ref="md"
:toolbars="toolbars"
@imgAdd="imgAdd" @change="change" style="min-height: 600px"/>
imgAdd方法是记录每次插入图片时候上传到node
imgAdd(pos, $file){
console.log($file) //图片名
console.log($file.miniurl) //图片转换的base64编码
const NewsEdit = Qs.stringify({
name:$file.name,
imgBase:$file.miniurl
});
axios.post('/News',NewsEdit,{headers:{'Content-Type':'application/x-www-form-urlencoded'}})
.then((res)=>{
console.log(res.data)
})
},
**
重点是下面的node
**
- 引入这些模块
const fs = require('fs');
const path = require('path');
var bodyParser = require('body-parser');
- 使用模块
app.use(express.static('./dist'));//web层
app.use(bodyParser.json({limit:'5mb'})); //改变node默认上传的文件大小
app.use(bodyParser.urlencoded({ limit:'5mb', extended: false }));
3.node接口
新建一个upload文件放图片
app.post("/News",(req,res)=>{
let Newsmsg = req.body; //获取传输的qs内容
// console.log(Newsmsg)
let Img64 = Newsmsg.imgBase; //base格式的图片
//过滤data:URL
var base64Data = Img64.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = Buffer.from(base64Data, 'base64'); //转换为二进制
// console.log(dataBuffer);
//把图片以原文件名的形式保存在node根目录中
fs.writeFile(Newsmsg.name, dataBuffer, function(err) {
if(err){
res.send(err);
}else{
res.send("保存成功!");
}
})
var fileName = Newsmsg.name; //获取图片名
var sourceFile = path.join(__dirname, fileName); //图片的根目录地址
var destPath = path.join("upload", fileName); //在新建文件upload下的地址
console.log(sourceFile) //原图片路径
console.log(destPath) //更改后图片路径
fs.renameSync(sourceFile, destPath, function (err) { //移动图片
if (err) throw err;
fs.stat(destPath, function (err, stats) {
if (err) throw err;
console.log('stats: ' + JSON.stringify(stats));
});
});
});
好,在这里我遇到了一个问题,nodejs里面报以下形式的错误:
ENOENT:no such file or directory, rename ‘C:\Projects\d.... ’
我在网上找了很多,有的说是删除package-lock.json文件,我试了,好像没什么用,
而且他报这个错误的原因是因为我多次从桌面上传图片到node,然后我删除文件中的图片,然后我又上传,然后就报错…
我开始使用的是 fs.rename 而不是fs.renameSync
我解决这个问题的方法是:
先清除当前npm的缓存
npm cache verify -- 清除缓存命令
再把var destPath = path.join(__dirname,"upload", fileName);
修改成var destPath = path.join("upload", fileName); //在新建文件upload下的地址
我是这样就解决了报错的问题,上面那一步很重要。
其实还可以使用multer直接写入指定文件夹,但是我没用过,感兴趣的小伙伴可以琢磨一下,我这个办法属于多此一举了,还是不要学的哈,我只是记录一下。