将文件放在FTP站点上,其中包含来自字符串变量的内容(无本地文件)

lee*_*mes 10 php ftp

我想将文件上传到FTP服务器,但文件内容保存在变量中,而不是实际的本地文件中.我想避免使用文件; 这是为了避免在(可能)不那么安全的系统(*)上处理敏感数据时的安全风险,以及最小化文件处理(已经很低)的开销.

但PHP的FTP API仅提供通过函数从本地文件上传文件ftp_put或(当文件已作为文件句柄打开时)ftp_fput.

目前,我将此函数与临时文件一起使用,我在上传之前编写内容:

$tmpfile = tmpfile();
fwrite($tmpfile, $content);
fseek($tmpfile, 0);
ftp_fput($ftp, $filename, $tmpfile, FTP_BINARY);
Run Code Online (Sandbox Code Playgroud)

有没有在本地(PHP)网站上使用文件的简单方法?

ftp_raw可以用来发送任意命令,所以我可以PUT手动发出命令,但是我没有看到在数据通道上手动写入数据的方法......

我不知道它是否重要,但FTP连接是用SSL(ftp_ssl_connect)保护的.


(*)考虑攻击者对整个文件系统具有只读控制的情况.

lee*_*mes 17

这可能不是最终的解决方案,但我想仍然比原来的方法更好:

您可以使用PHP内存流来避免文件系统上的临时文件.它基本上是一个文件句柄包装器(幕后)不使用实际文件,而是使用一些内存块.

所以几乎你仍然使用文件句柄(所以ftp_fput很高兴),但没有实际的文件(所以没有文件写入磁盘,开销保持最小).

$tmpfile = fopen('php://memory', 'r+');
fputs($tmpfile, $content);
rewind($tmpfile); // or fseek
Run Code Online (Sandbox Code Playgroud)

请注意,在上载多个文件时,您可以通过为所有文件重复使用相同的文件句柄来进一步减少开销(当然,除非您并行化过程).在这种情况下,还要回滚文件ftp_fput以及使用截断文件ftruncate($tmpfile, 0).

  • 为什么这不是最终的解决方案,这是因为它有点骇人听闻,还是因为这会带来风险? (2认同)