关于node 的stream Api ,网上有挺多介绍的,这里推荐一篇github上的,可以帮助你了解什么是stream,读完之后再来看这个实际的使用
这里我写了个例子,可以利用stream实现切片上传,秒传和断点续传
这里我客户端那边使用了webuploader,构建了一个可以切片上传的前端,服务端在收到所有的切片之后,将切片重新合并成一个完整的文件,这个合并的过程我们使用的就是stream。
流程是这样的,客户端在表单中添加进了一个文件,计算其md5值之后,发送给服务端(包括文件信息),服务端根据这个md5值,查询数据库中是否存在
- 存在:res.json({err:”exist”})
,把查询结果返回个客户端,客户端根据结果来决定是否上传这个文件。
假设查询到了这个值,直接将这个文件标记为已上传,这就是简单的秒传实现了。
假如没有查询到这个值,便进行上传。
每个切片上传之前,请求服务器查询stack 集合里面是否存在,
- 存在,将切片标记为已经上传
- 不存在则上传
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()
}
})
});
})