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

时间:2015-06-26 14:11:03

标签: 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);

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

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

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

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

4 个答案:

答案 0 :(得分:16)

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

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

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

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

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

答案 1 :(得分:2)

fopen应该可以通过ftp连接:

http://php.net/manual/en/function.fopen.php

然后使用fwrite将字符串写入连接:

http://php.net/manual/en/function.fwrite.php

fwrite的第二个参数是需要写的字符串 - 你不需要那里的文件。

答案 2 :(得分:2)

不涉及本地文件(ftp_fput):

$stream = fopen('php://memory','r+');
fwrite($stream, $newFileContent);
rewind($stream);

$success = ftp_fput($connectionId, "remoteFileName", $stream, FTP_BINARY);

fclose($stream);

答案 3 :(得分:0)

----- FTP PUT内容(php 7.0)---

$tmpFile = tmpfile();
fwrite($tmpFile, $contents);
rewind($tmpFile);
$tmpMetaData = stream_get_meta_data($tmpFile);

if (ftp_put($ftpObj, $remoteFile, $tmpMetaData['uri'], FTP_ASCII)) {
      echo "success";
}else {
       echo "fail"
}
fclose($tmpFile);