node stream api的应用,断电续传与秒传的例子

关于node 的stream Api ,网上有挺多介绍的,这里推荐一篇github上的,可以帮助你了解什么是stream,读完之后再来看这个实际的使用

这里我写了个例子,可以利用stream实现切片上传,秒传和断点续传

这里我客户端那边使用了webuploader,构建了一个可以切片上传的前端,服务端在收到所有的切片之后,将切片重新合并成一个完整的文件,这个合并的过程我们使用的就是stream。

流程是这样的,客户端在表单中添加进了一个文件,计算其md5值之后,发送给服务端(包括文件信息),服务端根据这个md5值,查询数据库中是否存在

  1. 存在:res.json({err:”exist”})

,把查询结果返回个客户端,客户端根据结果来决定是否上传这个文件。

假设查询到了这个值,直接将这个文件标记为已上传,这就是简单的秒传实现了。

假如没有查询到这个值,便进行上传。

每个切片上传之前,请求服务器查询stack 集合里面是否存在,

  1. 存在,将切片标记为已经上传
  2. 不存在则上传
import React from "react"
import ReactDOM from "react-dom"
import WebUploader from "tb-webuploader/dist/webuploader.js"
class App extends React.Component {
   
    constructor(props) {
        super(props)
    }
    uploader() {
    }
    componentDidMount() {
        WebUploader.Uploader.register({
            'before-send': 'beforeSend'
        }, {
            beforeSend: block=> {
                var deferred = WebUploader.Base.Deferred()
                $.ajax({
                    type:"GET",
                    url:"/files/chunk",
                    data:{
                            chunk:block.chunk,
                            chunks:block.chunks,
                            fileName:block.file.name
                    },
                    success:res=>{
                        console.log(res)
                        if(res.err){
                           deferred.reject()
                        }
                        else{
                            deferred.resolve()
                        }
                    }
                })
                return deferred.promise();
            }

        })
        this.uploader=WebUploader.create({
            swf: '/js/Uploader.swf',
            server: '/files',
            pick: '#picker',
            resize: false,
            chunked: true,
            threads: 1
        })
            .on("fileQueued", file=> {
                this.uploader.md5File(file)
                    .progress(function (percentage) {
                        console.log('Percentage:', percentage);
                    })
                    .then(md5=>{
                        $.ajax({
                            type:"GET",
                            url:"/files/md5/"+md5,
                            success:res=>{
                                console.log(res)
                                if(res.err) this.uploader.skipFile(file)
                                else this.uploader.upload()
                            }
                        })
                    });
            })
         
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值