如何通过PHP的ftp_pasv()向其他主机传文件?解决Zip损坏问题
问题解答
首先明确:可以通过PHP结合ftp_pasv函数向其他主机传输文件,你遇到的Zip文件损坏问题根源在于传输模式错误。
问题原因
你使用了FTP_ASCII模式传输Zip文件,这种模式专为纯文本文件设计,会自动转换换行符(比如将Windows的CRLF转为Unix的LF)。但Zip属于二进制文件,包含不可打印的二进制数据,ASCII模式会破坏这些数据结构,最终导致文件损坏无法打开。
修复后的代码
将传输模式替换为FTP_BINARY即可解决问题,同时建议补充关键步骤的错误检查,避免隐性问题:
$ftp_server = "ftp.domain.com"; $ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server"); $ftp_username = "USERNAME"; $ftp_userpass = "PASSWORD"; // 验证FTP登录状态 $login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass); if (!$login) { die("Failed to login to FTP server"); } // 启用被动模式(多数网络环境下必需) ftp_pasv($ftp_conn, true); // 定义本地与远程文件路径 $local_file = "path/to/your/local/file.zip"; $remote_file = "target/remote/file.zip"; // 使用二进制模式上传Zip文件 $upload_success = ftp_put($ftp_conn, $remote_file, $local_file, FTP_BINARY); if ($upload_success) { echo "Zip file uploaded successfully"; } else { echo "Failed to upload Zip file"; } ftp_close($ftp_conn);
额外注意事项
- 确保
$local_file变量指向正确的本地Zip文件路径,避免因路径错误传输空文件或错误文件 - 被动模式
ftp_pasv($ftp_conn, true)在防火墙、NAT环境中是必需的,能解决主动模式下的连接阻塞问题 - 若传输大文件,可通过
ftp_set_option($ftp_conn, FTP_TIMEOUT_SEC, 60)调整超时时间,避免因网络延迟导致传输中断
内容的提问来源于stack exchange,提问作者AmirHossein Aghajani
相关产品推荐
相关产品推荐

