ZIP档案只有在从PHP上传到FTP后才会损坏


ZIP Archive Becomes Corrupt Only After Upload to FTP From PHP

编辑:这准确地描述了我的问题,但我无法用PHP克服它:http://kb.winzip.com/kb/entry/149

我正在用PHP编写一个自动备份脚本,它可以备份我网站的文件和数据库,并将这些文件发送到远程FTP站点进行灾难恢复。我的SQL和ZIP文件(不是我的SQL上的双关语)是在服务器上完美生成的,但是,当我的ZIP档案上传到FTP站点时,它就会损坏。

我从生成ZIP文件的服务器上下载了该文件,并毫无问题地打开了它。但是,似乎没有一个ZIP提取程序能够在将同一文件传输到FTP站点并从那里下载后打开该文件。我可以毫无问题地打开我的SQL文件。

我很确定存档是可以的,但错误在于文件的传输:

$conn_id = ftp_connect("ftp.example.com");
$login_result = ftp_login($conn_id, "johnny1", "Re@l1y $tr0nG P@5swOrd!");
$dbBackup = fopen('database-backup.sql', 'r');
$filesBackup = fopen('files-backup.zip', 'r');
if (ftp_fput($conn_id, 'database/backup.sql', $dbBackup, FTP_BINARY) && 
    ftp_fput($conn_id, 'files/backup.zip', $filesBackup, FTP_BINARY)) {
  echo "Done!<br>";
} else {
   echo "Failed";
   exit;
}
ftp_close($conn_id);
fclose($dbBackup);
fclose($filesBackup);

您可以从这里看到ZIP文件的传输有什么问题吗?

谢谢你抽出时间。

我在Ubuntu系统上测试了你的代码,它运行起来没有问题
这可能是FTP服务器的问题;您应该尝试在另一个FTP服务器上上传该文件。

您可以尝试以二进制模式打开zip文件。推荐使用。

为了便于移植,强烈建议您在使用fopen()打开文件时始终使用'b'标志。

fopen('files-backup.zip', 'rb');