PHP: как записать файл dBase из памяти на FTP - PullRequest
0 голосов
/ 22 января 2019

Я хочу сохранить файл dBase на FTP-сервере прямо из памяти.Я использую следующий упрощенный фрагмент.Файл dBase также хранится на сервере - но он пуст.

Что я сделал не так?

Есть ли способ сделать это, не сохранив сначала файл локально, а затем передав егочерез ftp?

$ftp_conn = ftp_connect($ftpserver);
ftp_login($ftp_conn, $user, $password);
ftp_chdir($ftp_conn, $destination);
$memstream = fopen('php://memory', 'r+');
if ($myClass->create($memstream)) {       // my function around dbase_create() 
    $numRecords = count($myData); 
    if ($numRecords) {
        $myClass->open();                 // my function around dbase_open()
        foreach ($myData as $myRec) {
            $myClass->addRecord($myRec);  // my function around dbase_add_record()
        }
        $myClass->close();                // my function around dbase_close()
        /** the following lines are for debugging
          * they are delivering correct data -
          * so there is still access to the dBase file 
          **/
        $fritzAdr->open();
        print_r($fritzAdr->getRecord(1);
        $fritzAdr->close();
        $fritzAdr->open();
        print_r($fritzAdr->getRecord($fritz->countRecords())
        $fritzAdr->close();
        // but the $memstream is empty!
        rewind($memstream);
        ftp_fput($ftp_conn, 'filename.dbf',  $memstream, FTP_BINARY);
    }
fclose($memstream);
ftp_close($ftp_conn);

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

В конце я написал свой собственный класс, который может сгенерировать нужный файл dBase III: https://github.com/BlackSenator/fritzadr, и он работал желаемым образом:

$memstream = fopen('php://memory', 'r+');
if ($numRecords) {
    $fritzAdr = new fritzadr();
    foreach ($faxContacts as $faxContact) {
        $fritzAdr->addRecord($faxContact);
    }
    fputs($memstream, $fritzAdr->getDatabase());
    rewind($memstream);
    ftp_fput($ftp_conn, 'fritzadr.dbf', $memstream, FTP_BINARY);
}
fclose($memstream);
ftp_close($ftp_conn);
0 голосов
/ 22 января 2019

Вам, вероятно, нужно «закрыть» базу данных перед загрузкой:

$myClass->close();                // my wrapper around dbase_close()
if ($numRecords) {
    rewind($memstream);
    ftp_fput($ftp_conn, 'filename.dbf',  $memstream, FTP_BINARY);
}

Вам также следует рассмотреть возможность сохранения базы данных непосредственно в поток FTP, чтобы не тратить память и время на созданиепоток временной памяти:

$stream = fopen("ftp://$user:$password/$ftpserver/$destination/filename.dbf", 'r+');

См. Создание файла CSV на внешнем FTP-сервере в PHP .

...