js + node 分片上传

Posted ksyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js + node 分片上传相关的知识,希望对你有一定的参考价值。

首先是html5的几个规范

  • File
  • FileReader
  • ArrayBuffer
  • Blob

input上传的文件就是File类型文件,而File是基于Blob设计的。

接口自带slice方法,可以分割文件,达到分片上传的目的。

FileReader可以读取Blob里面的内容。

//将字符串转换成 Blob对象
var blob = new Blob([‘中文字符串‘], 
    type: ‘text/plain‘
);
//将Blob 对象转换成字符串
var reader = new FileReader();
reader.readAsText(blob, ‘utf-8‘);
reader.onload = function (e) 
    console.info(reader.result);

 

 

把上传文件接口类型设定为multipart/form-data,然后上传经过slice分片的文件。

var file = document.getElementById(‘upload‘).file;
var form = new FormData();
var startSize = 0;
var chunkSize = 5242880; //每次分割5M
form.append(‘file‘,file.slice(startSize,startSize+chunkSize));
  startSize+=chunkSize;
xhr.open(‘post‘, ‘/upload‘, true);
xhr.send(form);

 

node里可以用中间件解析文件,比如formidable、multer

const formidable = require(‘formidable‘);

app.use(formidable (
   
      encoding: ‘utf-8‘,
      multiples: true, // req.files to be arrays of files
   
));

 

接口里可以用可读取流fs.createReadStream、读写文件操作文件,代码如下。

var fileInfo,
   fileReceive;

app.post(‘/upload‘,function (req, res) 
   console.log(‘files‘,req.files);
      var file = req.files.file;
      if(file && fileInfo.end < fileInfo.size)
         fs.readFile(file.path,(err,data)=>
            if(err)
               return console.error(err);
            ;
            fileReceive = fileReceive ? Buffer.concat([fileReceive,data]) : data;
            fileInfo.end += data.length;

            if(fileInfo.end >= fileInfo.size)
               fs.writeFile(fileInfo.name,fileReceive,()=>
                  console.log(‘上传完成!‘);
               );
            ;
            res.send(progress: fileInfo.end / fileInfo.size);
         );
      else
         res.send(‘error‘);
      
 );

 

先获取文件总大小、文件名字等信息,然后每次接受到分片文件后对buffer进行合并并且保存已经接受到的文件大小,当接受完成后保存文件。

注这个方法需要node可操作的内存大于接受文件,否则就要每次接受分片文件时都读写一遍文件,不再node里进行缓存,但是这样比较费时。

以上是关于js + node 分片上传的主要内容,如果未能解决你的问题,请参考以下文章

大文件上传前台分片后后台合并的问题

webuploader 文件分片上传 ?node接口

js 大文件分片上传处理如何实现?

原生JS实现大文件分片

js+前端分片上传大文件

js+php分片上传大文件方案