PHP: 如何将 dBase 文件从内存写入 FTP
PHP: how to write a dBase file from memory to FTP
我想直接从内存中将 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);
上传前您可能需要"close"数据库:
$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+');
参见。
最后我自己写了class,可以生成想要的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);
我想直接从内存中将 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);
上传前您可能需要"close"数据库:
$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+');
参见
最后我自己写了class,可以生成想要的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);