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里进行缓存,但是这样比较费时。

原文地址:https://www.cnblogs.com/ksyy/p/11526340.html

时间: 2024-07-30 21:17:33

js + node 分片上传的相关文章

Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介 nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码 这里选择了formidable,也是githu

js实现大文件分片上传的方法

借助js的Blob对象FormData对象可以实现大文件分片上传的功能,关于Blob和FormData的具体使用方法可以到如下地址去查看FormData 对象的使用Blob 对象的使用以下是实现代码,本例中后端代码使用php来实现,只是演示基本功能,具体一些文件验证逻辑先忽略.前段代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

js+php大文件分片上传

1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通过浏览器上传至服务器,做一层中转便可以实现,但当这份文件非常大到了10GB级别,我们就需要思考另一种形式的技术方案了,也就是本文要阐述的方案. 技术要求主要有以下几方面: 支持超大数据量.10G级别以上 稳定性:除网络异常情况100%成功 准确性:数据无丢失,读写准确性100% 效率:1G文件分钟级

利用HTML5分片上传超大文件

在网页中直接上传大文件一直是个比较头疼的问题,主要面临的问题一般包括两类:一是上传时间长中途一旦出错会导致前功尽弃:二是服务端配置复杂,要考虑接收超大表单和超时问题,如果是托管主机没准还改不了配置,默认只能接收小于4MB的附件. 比较理想的方案是能够把大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分片的大小可以控制在4MB以内,服务端不用做任何设置就可适应. 常用的解决方案是RIA,以flex为例,通常是利用File

用openoffice+jodconverter+webuploader+pdf.js实现文件上传、在线预览功能

一.背景 最近公司一个项目要实现一个文件上传以及多文档在线预览的功能,之前一直做无线工具开发的,没有涉及到这些东西.另外项目组缺java开发人员,而且自己也只是一个半吊子前端加小半吊子java开发人员,所以让我一个人先弄个Demo出来瞧瞧.在网上搜索了不少资料,在这里只是整理一下,留作以后查阅. 二.插件以及工具包 1.pdfjs-v1.7.225  前端pdf格式文件的显示组件 2.webuploader-0.1.5  百度的文件上传组件 3.video-js-6.2.5 html5视频播放组

大文件分片上传,断点续传,秒传 实现

前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽弃: 解决方案: 1,修改服务端上传的限制配置:Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好: 2,大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分

plupload 大文件分片上传与PHP分片合并探索

最近老大分给我了做一个电影cms系统,其中涉及到一个功能,使用七牛云的文件上传功能.七牛javascript skd,使用起来很方便,屏蔽了许多的技术细节.如果只满足与调用sdk,那么可能工作中也就没有什么收获了.其中对七牛云的服务很佩服的一点是,无论我上传多大的文件,当我文件最后一片上传完成的时候,就立刻返回到文件链接,这个问题我想了好久,也不知道七牛是如何做到的. 七牛云的sdk分为 JavaScript 与 PHP端. JavaScript端的作用是提供文件上传功能,客户端(浏览器)无需关

大文件分片上传

Vue项目中遇到了大文件分片上传的问题,之前用过webuploader,索性就把Vue2.0与webuploader结合起来使用,封装了一个vue的上传组件,使用起来也比较舒爽. 上传就上传吧,为什么搞得那么麻烦,用分片上传? 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度.当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度. 实现后的界面: 主要是两个文件,封装的上传组件和具体的ui页面,上传组件代码下面有列出来.

JS大文件上传解决方案

1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通过浏览器上传至服务器,做一层中转便可以实现,但当这份文件非常大到了10GB级别,我们就需要思考另一种形式的技术方案了,也就是本文要阐述的方案. 技术要求主要有以下几方面: 支持超大数据量.10G级别以上 稳定性:除网络异常情况100%成功 准确性:数据无丢失,读写准确性100% 效率:1G文件分钟级