0

我正在尝试从 FTP 服务器下载经过压缩的文件。

它似乎已成功下载(正确的文件大小等),但是当我提取内容时,它未能说明数据格式被违反。

如果我使用像 FileZilla 这样的 FTP 客户端手动下载相同的文件,然后解压缩它,则解压可以工作,这意味着我用于下载文件的 PHP 在某种程度上是不正确的。

这是我的代码:

$this->_file = 'data.csv.gz';
$this->_directory = DOC_ROOT.'/imports/';

private function _loadFromFtpDataSource($url=null,$username=null,$password=null) {
    try {
        $conn_id = ftp_connect($url);
        $login_result = ftp_login($conn_id, $username, password);
        ftp_pasv($conn_id, true);
        $handle = fopen($this->_directory . $this->_file, "w");
        ftp_fget($conn_id, $handle, $this->_file, FTP_ASCII, 0);            
        ftp_close($conn_id);
        fclose($handle);
    } catch (Exception $e) {
        $this->status = false;
        error_log("Failed to connect to ftp server");
    }
}

任何人都可以看到它可能无法正确下载的任何原因吗?通过 FTP 下载 gunzip 压缩文件时是否需要特别注意?

4

3 回答 3

2

尝试更改此行:

ftp_fget($conn_id, $handle, $this->_file, FTP_ASCII, 0);

ftp_fget($conn_id, $handle, $this->_file, FTP_BINARY, 0);

您正在传输二进制数据存档 ( ...when I extract the contents...) 而不是文本文件在http://www.coreftp.com/docs/web1/Ascii_vs_Binary_transfers.htm
上阅读更多内容

于 2011-11-18T09:16:32.140 回答
1

如果文件不使用纯 ASCII(例如 UTF-8 代替),您的下载很可能会损坏。如果将模式从 FTP_ASCII 更改为 FTP_BINARY,应该没问题。

于 2011-11-18T09:17:47.603 回答
1

二进制文件需要以binary模式而不是ascii模式下载

$this->_file = 'data.csv.gz';
$this->_directory = DOC_ROOT.'/imports/';

private function _loadFromFtpDataSource($url=null,$username=null,$password=null) {
    try {
        $conn_id = ftp_connect($url);
        $login_result = ftp_login($conn_id, $username, password);
        ftp_pasv($conn_id, true);
        $handle = fopen($this->_directory . $this->_file, "w");
        ftp_fget($conn_id, $handle, $this->_file, FTP_BINARY, 0);            
        ftp_close($conn_id);
        fclose($handle);
    } catch (Exception $e) {
        $this->status = false;
        error_log("Failed to connect to ftp server");
    }
}
于 2011-11-18T09:19:08.973 回答