【问题标题】:How to read csv file from zip file on remote server with php?如何使用 php 从远程服务器上的 zip 文件中读取 csv 文件?
【发布时间】:2019-11-14 23:40:34
【问题描述】:

我想从远程服务器读取一个 zip 文件。我目前必须遵循代码:

    private $sftp;
    public function __construct($username, $password, $serverName)
    {
        $this->sftp = new Net_SFTP($serverName);
        if (!$this->sftp->login($username, $password)) {
            exit('Login Failed');
        }
    }

    public function buildRecords() {
        $sftp = $this->sftp;
        $sftp -> chdir(Constants::QUICKCHECK_OUTPUT_DIRECTORY);
        echo $sftp->pwd(); // show that we're in the 'test' directory
       // print_r($sftp->nlist());
        foreach($sftp->nlist() as $zipFile) {
            $handle = fopen("zip://" . $zipFile,'r');
            while($line = fgetcsv($handle)) {
                print_r($line);
            }
        }
    }

当我运行这段代码并调用这些方法时,我得到了错误

Warning: fopen(zip://test.zip): failed to open stream: operation failed in /var/www/html/update_alerts2.php on line 67

如何解决此错误? (我正在使用 phpseclib 到 sftp)

【问题讨论】:

标签: php csv zip sftp fopen


【解决方案1】:

fopen 不会神奇地访问远程服务器上的文件,因为您之前使用 phpseclib 登录过服务器。

您必须使用 phpseclib 函数来检索文件内容。

不幸的是,phpseclib 不提供按行/块读取远程文件内容的方法。但由于它是 CSV 文件,因此一次从文件加载到内存可能是可以的。为此,您可以使用SFTP::get,如果您没有指定$local_file 参数:

$contents = $sftp->get($zipFile);
$lines = explode("\n", $contents);
foreach ($lines as $line)
{
    if (strlen($line) > 0)
    {
        $fields = str_getcsv($line);
        print_r($fields);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多