Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在每个请求上打开文件句柄,而不是仅打开一次_Javascript_Node.js_Io_Sftp_Fs - Fatal编程技术网

Javascript 在每个请求上打开文件句柄,而不是仅打开一次

Javascript 在每个请求上打开文件句柄,而不是仅打开一次,javascript,node.js,io,sftp,fs,Javascript,Node.js,Io,Sftp,Fs,这是关于SFTP协议的,您可以从服务器下载文件 SFTP客户端将发出多个“读取”请求,可能是为了更快地下载多个文件 在正常情况下,服务器收到一个打开的请求,然后多次读取请求,然后关闭 因此,在打开请求中,服务器“打开”本地文件句柄(fs.OPEN),在关闭请求中关闭它(fs.CLOSE)。。。但是,如果客户机很淘气,想要做一些令人讨厌的事情,只是发送多个打开的文件请求,使服务器内存不足,该怎么办 在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它。但会产

这是关于SFTP协议的,您可以从服务器下载文件

SFTP客户端将发出多个“读取”请求,可能是为了更快地下载多个文件

在正常情况下,服务器收到一个打开的请求,然后多次读取请求,然后关闭

因此,在打开请求中,服务器“打开”本地文件句柄(
fs.OPEN
),在关闭请求中关闭它(
fs.CLOSE
)。。。但是,如果客户机很淘气,想要做一些令人讨厌的事情,只是发送多个打开的文件请求,使服务器内存不足,该怎么办


在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它。但会产生其他问题吗?我的意思是,由于多个读取请求可以并行运行,因此可能会有许多文件句柄打开,指向同一个本地文件。

要向客户端发送文件,您可以使用
createReadStream
而不是执行
fs.open
fs.close
,类似这样的操作

// in response section...
res.writeHead(200, headers);
fs.createReadStream(file).pipe(res)

要将文件发送到客户端,您可以使用
createReadStream
而不是执行
fs.open
fs.close
,类似这样的操作

// in response section...
res.writeHead(200, headers);
fs.createReadStream(file).pipe(res)
fs.createReadStream()可以处理开始和结束字节,以处理每个后续读取请求。见下文。此外,为了确保恶意用户没有发出请求,您应该在读取文件数据之前处理该请求。如果这是匿名SFTP,您可以对请求者IP执行检查,并将单个IP限制为每个IP的单个打开/读取流。。。或者限制单个IP/文件路径组合。只需将其存储在一个局部变量中,然后打开,添加到日志中,并在完成下载后将其删除

fs.createReadStream('sample.txt', {
  'flags': 'r',          //<string> See support of file system flags. Default: 'r'.
  'encoding': null,      // <string> Default: null
  'autoClose': true,     // <boolean> Default: true
  'emitClose': false,    // <boolean> Default: false
  'start': 0,            // <integer>
  'end': Infinity,       // <integer> Default: Infinity
  'highWaterMark': (64 * 1024),   // <integer> Default: 64 * 1024
});
资料来源:


改用:ftp srv

综上所述,我认为使用一个名为FTP srv的优秀FTP包会更好,它可以处理所有这些以及更多问题。我在生产中使用过它,每天有数百名用户和数千名每日下载/上传,没有问题。基于你文章中的考虑因素,你将无法防范恶意用户。尤其是涉及FTP/SFTP时,几乎每秒都有大量恶意请求通过扫描机器人程序传入。你需要有一种方法来禁止你发现是恶意的IP。ftp srv将处理所有这些以及更多问题

根据我的经验,最好的节点FTP服务器是:

见:

我与包没有任何关联。

fs.createReadStream()可以处理开始和结束字节,以处理每个后续读取请求。见下文。此外,为了确保恶意用户没有发出请求,您应该在读取文件数据之前处理该请求。如果这是匿名SFTP,您可以对请求者IP执行检查,并将单个IP限制为每个IP的单个打开/读取流。。。或者限制单个IP/文件路径组合。只需将其存储在一个局部变量中,然后打开,添加到日志中,并在完成下载后将其删除

fs.createReadStream('sample.txt', {
  'flags': 'r',          //<string> See support of file system flags. Default: 'r'.
  'encoding': null,      // <string> Default: null
  'autoClose': true,     // <boolean> Default: true
  'emitClose': false,    // <boolean> Default: false
  'start': 0,            // <integer>
  'end': Infinity,       // <integer> Default: Infinity
  'highWaterMark': (64 * 1024),   // <integer> Default: 64 * 1024
});
资料来源:


改用:ftp srv

综上所述,我认为使用一个名为FTP srv的优秀FTP包会更好,它可以处理所有这些以及更多问题。我在生产中使用过它,每天有数百名用户和数千名每日下载/上传,没有问题。基于你文章中的考虑因素,你将无法防范恶意用户。尤其是涉及FTP/SFTP时,几乎每秒都有大量恶意请求通过扫描机器人程序传入。你需要有一种方法来禁止你发现是恶意的IP。ftp srv将处理所有这些以及更多问题

根据我的经验,最好的节点FTP服务器是:

见:

我和这个包裹没有任何关系

在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它

当然

但会产生其他问题吗

为什么会这样

我的意思是,由于多个读取请求可以并行运行,因此可能有许多文件句柄打开指向同一个本地文件

唯一的问题是,一旦达到打开文件的限制(我想您知道
ulimit
),您的服务器将在下次尝试打开时出错。在达到该限制之前,如果描述符用于不同的文件(或套接字、管道或设备…)或同一文件的所有文件,则没有任何区别

在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它

当然

但会产生其他问题吗

为什么会这样

我的意思是,由于多个读取请求可以并行运行,因此可能有许多文件句柄打开指向同一个本地文件


唯一的问题是,一旦达到打开文件的限制(我想您知道
ulimit
),您的服务器将在下次尝试打开时出错。在达到该限制之前,如果描述符用于不同的文件(或套接字、管道或设备…)或同一文件的所有描述符,则没有任何区别。

我相信您有一个SFTP服务器,需要向其他人提供访问权,以便从服务器读取数据

您必须创建公钥私钥,并将公钥提供给客户端,和/或创建密码。只有真正的客户端才能在您的服务器上打开连接(限制DDOS类型的攻击)

此外,即使是SFTP编码也必须像数据库一样对待,连接应该共享(连接池),我的意思是说打开连接一次,然后执行尽可能多的读写操作,然后关闭连接。所以,即使需要异步读写文件,也必须首先打开连接并异步读写