之前想用 formidable来处理,后来发现在新版本expressjs下根本无法使用。查了一下,新版的ExpressJS使用了1.8 以上版本的Connect,提供了自己的BodyParser用来做form表单的解析。 Connect的BodyParser的时候并没有提供process事件的支持。注释里面也有说明如果希望直接使用formidable直接处理request的话,可以使用delete express.bodyParser.parse['multipart/form-data'];先删除它的这层解析,再用formidable的方法直接处理请求。
我还是选择了直接用expressjs直接来处理。方法如下。
exports.uploadimg = function(req, res) {
// 获得文件的临时路径
var tmp_path = req.files.myfile.path;
// 指定文件上传后的目录 - 示例为"images"目录。
var target_path = './public/images/' + req.files.myfile.name;
// 移动文件
fs.rename(tmp_path, target_path, function(err) {
if (err) throw err;
// 删除临时文件夹文件,
fs.unlink(tmp_path, function() {
if (err) throw err;
var info = '{"error":"","msg":"'+target_path+'"}';
res.send(info);
// res.send('File uploaded to: ' + target_path + ' - ' + req.files.myfile.size + ' bytes');
});
});
} 经过测试前端必须是 enctype="multipart/form-data"后台才能识别,用 enctype="multipart/file"就不行。为了监听发送成功返回的事件,我采用了ajaxFileUpload的Jquery插件来实现。具体方法如下:
function ajaxFileUpload() {
/*
prepareing ajax file upload
url: the url of script file handling the uploaded files
fileElementId: the file type of input element id and it will be the index of $_FILES Array()
dataType: it support json, xml
secureuri:use secure protocol
success: call back function when the ajax complete
error: callback function when the ajax failed
*/
$.ajaxFileUpload
(
{
url:'uploadimg',
secureuri:false,
fileElementId:'myfile',
dataType: 'json',
success: function (data, status)
{
if(typeof(data.error) != 'undefined')
{
if(data.error != '')
{
alert(data.error);
}else
{
alert(data.msg);
}
}
},
error: function (data, status, e)
{
alert(e);
}
}
)
return false;
}
希望对大家有用!