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配置文件分段下载功能的实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!