我正在弄乱node.js,发现了两种读取文件并通过有线方式发送文件的方法,一旦我确定它存在并使用writeHead发送正确的MIME类型:
// read the entire file into memory and then spit it out fs.readFile(filename, function(err, data){ if (err) throw err; response.write(data, 'utf8'); response.end(); }); // read and pass the file as a stream of chunks fs.createReadStream(filename, { 'flags': 'r', 'encoding': 'binary', 'mode': 0666, 'bufferSize': 4 * 1024 }).addListener( "data", function(chunk) { response.write(chunk, 'binary'); }).addListener( "close",function() { response.end(); });
如果所讨论的文件很大,例如视频,fs.createReadStream可能会提供更好的用户体验,我是否正确?感觉好像不那么块状。这是真的?我还需要了解其他优点,缺点,警告或陷阱吗?
如果您只是将“数据”连接到“ write()”,将“关闭”连接到“ end()”,则是一种更好的方法:
// 0.3.x style fs.createReadStream(filename, { 'bufferSize': 4 * 1024 }).pipe(response) // 0.2.x style sys.pump(fs.createReadStream(filename, { 'bufferSize': 4 * 1024 }), response)
“ read.pipe(write)或” sys.pump(read, write)方法的好处还在于增加了流量控制。因此,如果写入流不能尽快接受数据,它将通知读取流回退,以最大程度地减少缓冲在内存中的数据量。
read.pipe(write)
sys.pump(read, write)
在flags:"r"和mode:0666由事实,这是一个暗示FileReadStream。该binary编码已过时- 如果没有指定编码,它会刚刚与原始数据缓冲区的工作。
flags:"r"
mode:0666
FileReadStream
binary
此外,您还可以添加其他一些功能,使您的文件更加流畅:
req.headers.range
/bytes=([0-9]+)-([0-9]+)/
304 Not Modified
if-modified-since
mtime
另外,通常,如果可以的话,发送Content-Length标题。(您正在stat-ing文件,因此您应该拥有此文件。)
Content-Length
stat