Laravel生成的Zip文件经SFTP上传至服务器后损坏问题排查
解决SFTP上传Zip文件损坏的问题
嘿,我之前也碰到过一模一样的情况!本地生成的Zip好好的,一通过phpseclib的SFTP上传到服务器就损坏,核心原因就是文件传输模式不对——phpseclib的put()方法默认用的是文本模式,而Zip这类二进制文件必须用二进制模式传输,不然换行符转换之类的操作会直接破坏文件结构。
直接改代码就行
把你上传文件的那行代码,加上二进制模式的参数:
$s = $sftp->put($filename, $file.$filename, SFTP::BINARY);
或者更完整的写法(明确指定本地文件源+二进制模式):
$s = $sftp->put($filename, $file.$filename, SFTP::SOURCE_LOCAL_FILE | SFTP::BINARY);
为啥会这样?
文本模式下,SFTP会自动处理换行符(比如把Windows的\r\n换成Linux的\n),但Zip是二进制格式,每一个字节都不能乱改,一转换就直接损坏了。二进制模式会原封不动地把本地文件的所有字节传上去,自然就不会有问题了。
额外可以检查的点
- 先确认
$file.$filename这个路径是对的,别拼接错了传了个空文件或者别的文件上去 - 上传前后对比下本地和服务器上文件的大小,如果大小不一样,那肯定是传输过程中字节被改了,二进制模式就能解决
- 也可以试试先把本地Zip文件手动通过SFTP工具(比如FileZilla)传上去,如果能正常解压,那就坐实是代码里的传输模式问题了
内容的提问来源于stack exchange,提问作者LordGrim
相关产品推荐
相关产品推荐

