前端ajax上传文件,图片,后端nodejs吸收文件;
进修了nodejs,就想完成一下有进度条的文件上传,
在做这个功用的时刻碰到的题目
用一般的ajax没法完成文件上传,只能post,get,一些json,string字符串;
想要上传文件或许图片,能够增加form上传;注重须要在form上增加 标示 enctype=”multipart/form-data”
瑕玷,如许会颠倒页面的革新;很蹩脚有无
还能够在页面中增加一个ifame,将表单提交到ifame中,不过,一听说有iframe就有点糟心有无;
因而就有了下面的东西;
请自动疏忽没有款式(只是为了完胜利用)这个梗,啊哈哈;
好了废话少说直接上代码
前端部份代码
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.progressBar{
width: 150px;
height: 15px;
border: 1px solid red;
/*display: none;*/
border-radius: 5px;
}
.bar {
width: 0;
height: 100%;
background: #08d09a;
border-radius: 5px;
line-height: 0;
margin: 0;
}
</style>
</head>
<body>
<button id="submit">提交</button>
<input type="file" name="file" id="fileInputElement"/>
<div class="progressBar" style="display: none;">
<p class="bar"></p>
</div>
<script>
var btn = document.getElementById('submit');
var fileInputElement = document.getElementById('fileInputElement');
var bar = document.getElementsByClassName('bar')[0];
var progressBar = document.getElementsByClassName('progressBar')[0];
btn.onclick =function(){
progressBar.style.display = 'block';
var oMyForm = new FormData();
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456);
// 数字123456被马上转换成字符串"123456"
// fileInputElement中已包括了用户所挑选的文件
oMyForm.append("userfile", fileInputElement.files[0]);
var oFileBody = '<a id="a"><b id="b">hey!</b></a>'; // Blob对象包括的文件内容
var oBlob = new Blob([oFileBody], { type: "text/xml"});
var oReq = new XMLHttpRequest();
oReq.open("POST", "/formupload");
// 文件上传历程的回调
oReq.upload.onprogress = function(e) {
console.log((e.loaded/e.total)*100+'%')
bar.style.width = (e.loaded/e.total)*100+'%';
}
/**
* e.loaded 文件已上传了的大小
* e.total 文件总大小
e.loaded/e.total)*100+'%' 转化成比例;
*/
// 文件上传完毕的回调
oReq.upload.onloadend = function(e) {
console.log('吸收完成'+e.loaded+'/'+e.total);
setTimeout(function(){
progressBar.style.display = 'none';
bar.style.width = 0;
},1000)
}
oReq.send(oMyForm);
}
</script>
</body>
</html>
用到了 FormData 类;
使用要领
经由过程new FormData 建立一个form提交实例对象;此对象会有append要领,
用法 oMyform.append(name,value) name是一个字段,value是对应的值(能够是字符串,数字,file文件(经由过程dom.files[0]取得))
var oMyForm = new FormData();
oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456);
oMyForm.append("userfile", fileInputElement.files[0]);
用到了XMLHttpRequest 的 onprogress 和 onloadend
注重 onprogress、onloadend、须要经由过程xhr.upload 挪用以下;
oReq.upload.onprogress=function(e){
console.log(e.loaded)
console.log(e.total)
};
oReq.upload.onloadend=function(e){};
nodejs 后端的处置惩罚
重要用到了formidable模块
重要代码逻辑
/**
* [导出一个中间件,formupload,用于处置惩罚文件上传;]
*/
exports.formupload = function(req,res,next){
//console.log(req);
var form = new formidable.IncomingForm();
var uploadDir = path.normalize(__dirname+'/'+"../avatar");
form.uploadDir = uploadDir;
console.log(uploadDir);
form.parse(req, function(err, fields, files) {
for(item in files){
(function(){
var oldname = files[item].path;
var newname = files[item].name === 'blob' ? oldname+'.xml' : oldname+"."+files[item].name.split('.')[1];
fs.rename(oldname,newname,function(err){
if(err) console.log(err);
console.log('修正胜利');
})
})(item);
}
console.log(util.inspect({fields: fields, files: files}));
res.send('2');
});
碰到的题目
for 轮回中有异步逻辑,致使异步逻辑出现题目;
formidable 的上传文件途径用相对途径会找不到所指定的途径
解决办法
能够用闭包完成,每次传进到闭包的变量不会遭到外界的影响;
用牛逼的__dirname 变量;指向当前文件的绝对途径;