目录
1. 页面form是有text类型和file类型输入框,所以需要将form提交类型设置为enctype="multipart/form-data" method="post"
1. 页面form是有text类型和file类型输入框,所以需要将form提交类型设置为enctype="multipart/form-data" method="post"
<form action="/article/add" enctype="multipart/form-data" method="post">
<input type="hidden" name="id" value="<%- item.id %>">
<input type="hidden" name="page" value="<%- item.page %>">
<div class="inputTitle">请上传封面文件</div>
<input type="file" name="coverImg">
<div class="inputTitle">新闻内容:</div>
<textarea name="content" class="xheditor"><%- item.content %></textarea>
<% if (item.id) { %>
<input type="submit" value="修改">
<%} else {
%>
<input type="submit" value="发布">
<%}%>
</form>
2.普通的参数只需要req.body.id就可以取到,而文件在这种状态下只有一个文件名,enctype="multipart/form-data",可以传输文件,但node不可以使用req.body.id来接受数据。
需要用到插件multiparty。
1.安装插件,
2.引入到当前文件
var multiparty = require('multiparty');
3.使用
- 新建multiparty.Form()对象form
form的parse方法将req请求作为第一个参数,第二个参数是回调函数,在函数中:
三个参数是报错信息,普通参数数组,文件数组
普通参数id获取方式:
var id = parseInt(fields.id[0])
var newsType = parseInt(fields.newsType[0]) || 0
文件获取:var file = files.coverImg[0]
var form = new multiparty.Form()
form.parse(req, function(err, fields, files) {
if (err) {
//console.log('上传失败', err);
} else {
var id = parseInt(fields.id[0])
//console.log('id:',id)
var newsType = parseInt(fields.newsType[0]) || 0
var file = files.coverImg[0]
}
- 这个方法是将文件存到服务器:
uploadsCover(file, dirName),第一个参数是文件,第二个参数是文件夹名字。
如:公司新闻动态的文件file 放在covers下面的company文件夹下:uploadsCover(file, 'company'),
会返回cover是文件名字,将文件名存储到数据库,前端可以通过名字cover访问到;
其中使用了fs核心模块,需要进行导入:
var fs = require('fs');
function uploadsCover(file, dirName){
// var file = files.coverImg[0]
// console.log(file)
var rs = fs.createReadStream(file.path)
var cover = dirName + file.originalFilename
// console.log('cover:'+cover)
var newPath = '/covers/'+ cover
// console.log(newPath, '进行写文件')
var ws = fs.createWriteStream('./public' + newPath)
rs.pipe(ws)
ws.on('finish', function() {
// console.log('文件上传成功')
// res.send({err: '', msg: newPath})
})
return cover
}