phpseclib sftp->;put()命令:文件内容只是一个字符串,而不是预期的PDF文档

phpseclib sftp->;put()命令:文件内容只是一个字符串,而不是预期的PDF文档,php,file-upload,sftp,phpseclib,Php,File Upload,Sftp,Phpseclib,我正在尝试使用$sftp-put()将PDF文档从后台服务器上载到远程位置 代码: $sftp = new SFTP($config::SFTP_SERVER); // login to remote server if (!$sftp->login($config::SFTP_USER, $config::SFTP_PASSWORD)) { throw new Exception('Login failed'); } // move to relevant directory

我正在尝试使用$sftp-put()将PDF文档从后台服务器上载到远程位置

代码:

$sftp = new SFTP($config::SFTP_SERVER);

// login to remote server
if (!$sftp->login($config::SFTP_USER, $config::SFTP_PASSWORD)) {
    throw new Exception('Login failed');
}

// move to relevant directory
$sftp->chdir('fatca');

// upload file
$uploadFile = $sftp->put('test-pdf-upload.pdf', '/srv/www/vhosts/stage.johno.com/fatca/src/uploads/pdfs/345-553453-434__05122017_16:45:26.pdf', NET_SFTP_LOCAL_FILE);

// Error checking for local env only
var_dump($uploadFile);
var_dump($sftp->getSFTPLog());
我希望看到相同的PDF,其中包含用户数据和一些用户上传的图像。我还确认,原始PDF已在登台服务器上成功创建,它完好无损,并显示了相关信息

结果文件在新的远程服务器位置创建,但已损坏/无法读取

var_dump($sftp->getSFTPLog())的输出也不鼓励:

bool(false)
我做错了什么?感觉我已经很好地遵循了phpseclib文档。。。虽然这是屏幕前漫长的一天


非常感谢您一如既往的建议。

您正在使用phpseclib 2.0。我能看出来,因为你在做
newsftp()
而不是
newnet\u SFTP()
。对于2.0,您需要执行
SFTP::SOURCE\u LOCAL\u文件
。例如

$uploadFile =
    $sftp->put(
      'test-pdf-upload.pdf',
      '/srv/www/vhosts/stage.johno.com/fatca/src/uploads/pdfs/345-553453-434__05122017_16:45:26.pdf',
      SFTP::SOURCE_LOCAL_FILE);

我想发布SSH日志。不是SFTP日志,而是SSH日志。您可以通过执行
define('NET\u SSH2\u LOGGING',2)获得它们
然后
echo$ssh->getLog()。然后把结果发布到pastebin.com或dropbox之类的网站上。SSH日志将比SFTP日志更有用,因为一些错误可能发生在SSH层而不是SFTP层。SFTP层可以从SSH层提取,但不能从SSH层提取。感谢您的回复。意识到我做错了什么,需要用file_get_contents()将PDF文件位置包装到put()命令的第二个参数。现在可以正常工作了。@JohnO'Sullivan如果您使用
NET\u SFTP\u LOCAL\u FILE
模式,则情况并非如此。你使用的是什么版本的phpseclib?@MartinPrikryl-很好-这就是问题所在。他使用2.0是因为他在做
new-SFTP()
而不是
new-Net\u-SFTP()
。对于2.0,您需要执行
SFTP::SOURCE\u LOCAL\u文件