nodejs ajax进度条,前端ajax上传文件,图片,后端nodejs接收文件;

前端ajax上传文件,图片,后端nodejs接收文件;

学习了nodejs,就想实现一下有进度条的文件上传,

在做这个功能的时候遇到的问题

用普通的ajax无法实现文件上传,只能post,get,一些json,string字符串;

想要上传文件或者图片,可以添加form上传;注意需要在form上添加 标示 enctype="multipart/form-data"

缺点,这样会倒置页面的刷新;很糟糕有没有

还可以在页面中添加一个ifame,将表单提交到ifame中,不过,一听说有iframe就有点糟心有没有;

于是就有了下面的东西;

请自动忽略没有样式(只是为了实现功能)这个梗,啊哈哈;

好了废话少说直接上代码

前端部分代码

Document

.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;

}

提交

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 = 'hey!'; // 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);

}

用到了 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.οnprοgress=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 变量;指向当前文件的绝对路径;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 前端通过formdata的方式上传文件,可以使用表单文件控件或者通过js代码创建formdata对象进行上传。对于表单控件上传,需要在form标签中设置enctype属性为multipart/form-data,然后在input标签中设置type属性为file,这样即可将文件存储在formdata对象中。如果通过js代码创建formdata对象,直接通过append方法将文件添加到对象中,如下所示: ``` let formData = new FormData(); formData.append('file', file); ``` 其中,file为需要上传的文件对象。 后端使用koa-body中间件可以方便地处理上传的文件。先要在koa应用中使用该中间件,然后通过ctx.request.files获取上传的文件,如下所示: ``` const Koa = require('koa'); const koaBody = require('koa-body'); const app = new Koa(); app.use(koaBody({ multipart: true, // 支持文件上传 formidable: { maxFileSize: 200*1024*1024, // 设置上传文件大小,默认2M } })); app.use(async (ctx) => { const file = ctx.request.files.file; console.log(file.name, file.size); // 打印上传的文件名和大小 ctx.body = '上传成功'; }) ``` 其中,multipart设置为true表示支持文件上传,formidable对象中的maxFileSize表示最大上传文件大小,默认为2M。在处理上传的文件时,获取文件对象通过ctx.request.files即可,可以获取文件名、类型、大小等信息。最后,需要设置返回的数据为上传成功即可。 ### 回答2: 前端在实现文件上传的过程中,需要使用到formdata对象,formdata对象可以支持上传文件、文本信息以及表单数据等。要进行文件上传,需要注意选择文件类型的input的属性设置为"file",然后通过formdata对象将文件添加到数据中,在使用Ajax等技术将数据发送给后端。在使用formdata上传文件时,需要注意不同浏览器之间formdata对象的兼容性,可以使用polyfill等技术来进行统一。 对于后端的Koa框架来说,接收上传的文件可以使用koa-body中间件。koa-body中间件可以接收文件、文本信息以及表单数据等,可以将上传文件保存在指定的路径下,并且将上传的文件信息添加到ctx.request.body中进行统一管理。在使用koa-body中间件时,需要注意对于文件大小、上传路径、文件格式等进行配置管理,以免出现上传失败或者数据丢失的情况。 除此之外,如何管理和处理上传的文件也是需要考虑的重点,可以考虑使用nodejs中的fs模块进行文件操作,或者使用第三方插件如multer等来进行统一管理。在处理上传的文件时,还要注意对于文件大小、路径、格式进行校验和处理,以确保数据的有效性和安全性。 ### 回答3: 前端使用Formdata来上传文件,示例如下: ``` const formData = new FormData() formData.append('file', file) axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then((res) => { console.log(res.data) }) ``` 后端使用koa-body来接收上传的文件,示例如下: ``` const Koa = require('koa') const koaBody = require('koa-body') const app = new Koa() app.use(koaBody({ multipart: true, formidable: { uploadDir: './uploads', // 上传文件保存的路径 keepExtensions: true, // 保留文件扩展名 maxFieldsSize: 2 * 1024 * 1024 // 最大文件大小为2MB } })) app.use(async (ctx) => { const file = ctx.request.files.file console.log(file) // 处理文件逻辑 }) app.listen(3000) ``` 其中,koa-body需要设置multipart为true,表示支持文件上传,formidable则可以设置一些参数,如uploadDir表示文件保存的路径,keepExtensions表示是否保留文件扩展名,maxFieldsSize表示最大文件大小,可以根据需要进行调整。在处理请求时,可以通过ctx.request.files.file获取上传的文件信息,然后进行相应的业务逻辑处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值