Загрузка распакованного файла по FTP - PullRequest
0 голосов
/ 18 ноября 2011

Я пытаюсь загрузить заархивированный файл с FTP-сервера.

Похоже, что загрузка успешно (правильный размер файла и т. Д.), Но при извлечении содержимого происходит сбой, сообщая, что формат данныхНарушено.

Если я вручную загружаю тот же файл с помощью FTP-клиента, такого как FileZilla, а затем распаковываю его, извлечение работает, что означает, что мой 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?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Попробуйте изменить эту строку:

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

1 голос
/ 18 ноября 2011

Двоичные файлы необходимо загружать в режиме 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");
    }
}
1 голос
/ 18 ноября 2011

Если файл не использует чисто ASCII (например, вместо UTF-8), ваша загрузка, скорее всего, будет повреждена.Если вы измените режим с FTP_ASCII на FTP_BINARY, все будет в порядке.

...