Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
Html5提供了一个新的Range标签来实现文件的分段下载。在Node.JS中可以配置这个标签来实现文件的分段下载。
Header标签
请求RequestHeader:下载3744以后的文件内容
range:bytes=3744-
返回ResponseHeader:文件总长15522643个字节
accept-ranges':'bytes' content-range':'bytes*/15522643'
Nginx配置
首先要配置Nginx支持range标签返回,很简单添加add_headerAccept-Rangesbytes;这一行即可
server{
listen80;
server_nameadksdf.com;
location~^/(img/|js/|css/|upload/|font/|fonts/|res/|icon){
add_headerAccess-Control-Allow-Origin*;
add_headerAccept-Rangesbytes;
root/var/www/...;
access_logoff;
expiresmax;
}
...
}
启用以后,如果node.js端发送了含有rangeheader的请求信息,那么nginx会返回含有range相关的信息:
这是一段完整的ResponseHeader,注意这里的content-length不是文件的总长度,而是当前range的长度。
{server:'nginx',
date:'Wed,24Jan201802:43:20GMT',
'content-type':'application/zip',
'content-length':'12420187',
'last-modified':'Tue,16Jan201812:09:47GMT',
connection:'close',
etag:'"5a5deb8b-ecdb53"',
expires:'Thu,31Dec203723:55:55GMT',
'cache-control':'max-age=315360000',
'access-control-allow-origin':'*',
'accept-ranges':'bytes',
'content-range':'bytes3102456-15522642/15522643'}
可以根据这个header中的content-range来获取文件的总大小。
Node.JS实现
这段示例先检测本地下了一半的文件,然后以'r+'读写模式创建文件流,并将response流写入文件。
这里将表态文件添加range的支持。
varreqOptions={url:packageUrl,headers:{}}
varfilepath='/path/to/your/part/file'
varfileOptions={}
fs.stat(filepath,function(err,states){
if(states){
//Range:bytes=3744-
reqOptions.headers['range']='bytes='+states.size+'-'
fileOptions={start:states.size,flags:'r+'}
}
//创建http对象方法
varreqUrl=reqOptions.url
varurlObj=url.parse(reqUrl)
varoptions={
hostname:urlObj.hostname
,port:urlObj.port
,path:urlObj.pathname
,headers:reqOptions.headers||{}
}
varreq=http.request(options,function(res){
varreceives=[]
varerr=null
varstatusCode=res.statusCode
varheaders=res.headers
varws=fs.createWriteStream(filepath,fileOptions)
ws.on('error',function(e){
console.log('wserror',e)
})
res.on('data',function(chrunk){
ws.write(chrunk)
})
res.on('error',function(err){
ws.end()
})
res.on('end',function(){
ws.end()
})
})
req.on('error',function(e){
cb&&cb(e,null,{})
})
req.end()
...
})
返回Header
在请求nginx可能会返回其他statuscode,比如说206或416,含意如下:
206PartialContent
返回的是部分文件内容
416RequestedRangeNotSatisfiable
请求的range超过文件尺寸
总结
以上所述是小编给大家介绍的Node.JS段点续传:Nginx配置文件分段下载功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!