在PHP中创建CSV文件并使用phpseclib保存到SFTP
问题描述:
我需要从MySQL
查询中生成一个CSV
文件,并将该文件保存到SFTP
服务器。我试过了下面的代码。 CSV
文件被创建,但它是空的。我还在浏览器中收到一条关于Warning: is_file() expects parameter 1 to be a valid path, resource given
关于此行$sftp->put($fileName, $fp, NET_SFTP_LOCAL_FILE);
的错误消息。如果我将fclose($fp);
移动到最后一行,我不会收到错误,但数据仍然不会出现在文件中。有人能让我知道如何让数据保存在创建的文件中吗?在PHP中创建CSV文件并使用phpseclib保存到SFTP
$fileName = 'dataFiles/reports/Report Summary/Report Summary.csv';
$sql = mysqli_query($db, "
SELECT *
FROM reports
WHERE reportID = 1
");
$fp = fopen('php://output', 'w');
$first = true;
while($row = mysqli_fetch_assoc($sql)){
if ($first) {
fputcsv($fp, array_keys($row));
$first = false;
}
fputcsv($fp, $row);
}
fclose($fp);
$sftp->put($fileName, $fp, NET_SFTP_LOCAL_FILE);
答
尝试是这样的:
<?php
$fp = fopen('php://temp', 'r+');
// do stuff
rewind($fp);
$sftp->put($filename, $fp);
phpseclib(假设你使用一个新的版本不够),将检测到的第二个参数是一个流资源,并会尝试从它相应的读取。
+1
谢谢!添加'rewind($ fp);'和移动'fclose($ fp);'到我已经拥有的是关键。 –
答
的second argument不是一个手柄,而是直接的内容。
我想你可以这样做:stream_get_contents($fp);
在第二个参数。
$content = stream_get_contents($fp);
fclose($fp);
$sftp->put($fileName, $content, NET_SFTP_LOCAL_FILE);
http://phpseclib.sourceforge.net/sftp/examples.html#put - 你需要给这个方法一个要写的数据的字符串,或者一个本地文件的名字来读取要写入的内容 - 不是文件指针。 – CBroe