【问题标题】:php sftp using ssh2 corrupting pdf filesphp sftp 使用 ssh2 破坏 pdf 文件
【发布时间】:2015-09-30 20:44:37
【问题描述】:

我正在尝试通过 SFTP 将 pdf 文件从我们的服务器传输到另一个服务器。我检查了这些文件,它们本身并没有损坏。我可以在命令行上将它们 scp 到我的计算机,它们就可以正常打开。 注意:我可以成功传输 pdf 文件,它只是在到达其他服务器后损坏。

我尝试了两种方法:

conn = ssh2_connect($url, 22);
$auth = ssh2_auth_password($conn, $userName, $password);

$sftp = ssh2_sftp($conn);
file_put_contents("ssh2.sftp://".$sftp.$remoteFilePath, $localFilePath);

看了这个问题后,我想到了下面的问题并尝试了给定的答案:

ssh2_scp_send() using php corrupts pdf

conn = ssh2_connect($url, 22);
$auth = ssh2_auth_password($conn, $userName, $password);

$sftp = ssh2_sftp($conn);
$fp = fopen("ssh2.sftp://".$sftp.$remoteFilePath, "w");
fwrite($fp, $localFilePath);
fclose($fp);

这也会传输文件,但也已损坏,因此一旦它在他们的服务器中,我就无法在我的 FTP GUI 中打开它。

我现在知道其他 php 扩展可以做到这一点。如果我不能让它工作,我会尝试一下,但我已经投入了足够的时间,它应该可以工作。有什么想法吗?

【问题讨论】:

  • 确保传输是二进制的
  • @Dagon 我检查了,例如,file_put_contents PHP 在文档中说是二进制安全的。我必须做些什么来启用我没有看到的二进制文件吗?
  • fopen 应该是 r 而不是 w? and add b so 'rb' "如果你在处理二进制文件时没有指定'b'标志,你的数据可能会遇到奇怪的问题,包括损坏的图像文件和\r\n字符的奇怪问题。 "
  • 真的吗?这会产生一大堆错误。我的理解是我正在打开一个不存在的文件进行写入(这会创建一个空白文件),然后我使用 fwrite() 写入新创建的文件。我尝试了 'r' 和 'rb',这引发了一堆错误。我也尝试了“wb”,但没有任何区别。
  • 对不起,我弄错了转移方向;(但 b 仍然适用

标签: php libssh2


【解决方案1】:

http://php.net/manual/en/function.ssh2-scp-send.php

并尝试:

$conn = ssh2_connect($url, 22);
$auth = ssh2_auth_password($conn, $userName, $password);

ssh2_scp_send($conn, $localFilePath, $remoteFilePath, 0644);

【讨论】:

  • 这需要 PECL ssh2 扩展,在问题的最后一行,原始提问者询问如何在没有 PHP 扩展的情况下执行此操作。
  • @mjsa 好的,没看到,谢谢。总之,值得一试
【解决方案2】:

找到答案。我的 $localFilePath 是这样写的:

$localFilePath = "/path/to/my/file.pdf";

file_put_contents() 和 fwrite() 将变量视为 字符串。因此它将创建一个新的 pdf 文件,其内容是字符串文件路径。我只是在尝试传输一个小的 .txt 文件后才发现这一点。所以,添加这个解决了问题:

$localFilePath = fopen("/path/to/my/file.pdf", "r");

我觉得奇怪的是我没有在我见过的 sftp 使用这种方法的示例中看到这个,但是你去吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多