使用 phpseclib Net_SFTP.get 下载文件夹不起作用

Downloading a folder with phpseclib Net_SFTP.get does not work

我正在尝试使用 phpseclib 访问 SFTP 文件夹服务器中的文件。但是当我尝试使用 $sftp->get 时,它 returns false。我完全不知道如何调试这个问题。

public function get_file_from_ftps_server()
{
    $sftp = new \phpseclib\Net\SFTP(getenv('INSTRUM_SERVER'));
    if (!$sftp->login(getenv('INSTRUM_USERNAME'), getenv('INSTRUM_PASSWORD'))) {
        exit('Login Failed');
    }

    $this->load->helper('file');           
    $root  = dirname(dirname(__FILE__));
    $root .= '/third_party/collections_get/';
    $path_to_server = 'testdownload/';
    $result = $sftp->get($path_to_server, $root);

    var_dump($result);
}

$result 中,我得到一个 false,我不确定为什么会这样,我阅读了他们的文档但仍然不确定。 Root 是我希望存储我的信息的目录。现在我只在那里添加了一个 trial.xml 文件,但也想知道如果它在文件夹中我怎样才能获得多个文件。

这是服务器结构的图片:

Net_SFTP.get方法只能下载一个文件。您不能使用它来下载整个目录。

如果你想下载整个目录,你必须使用 "list" 方法之一(Net_SFTP.nlistNet_SFTP.rawlist)来检索文件列表,然后下载文件-一个。

我平时使用sftp的时候,一般都是换个目录,然后再尝试下载资料。

$sftp->pwd(); // This will show you are in the root after connection.
$sftp->chdir('./testdownload'); // this will go inside the test directory.
$get_path = $sftp->pwd()
//If you want to download multiple data, use
$x = $sftp->nlist();
//Loop through `x` and then download the file using.
$result = $sftp->get($get_path); // Normally I use the string information that is returned and then download using

file_put_contents($root, $result);

// Root is your directory, and result is the string.
<?php
use phpseclib\Net\SFTP;

$sftp = new SFTP("server");

if(!$sftp->login("username", "password")) {
    throw new Exception("Connection failed");
}

// The directory you want to download the contents of
$sftp->chdir("/remote/system/path/");

// Loop through each file and download
foreach($sftp->nlist() as $file) {
    if($file != "." && $file != "..")
        $sftp->get("/remote/system/path/$file", "/local/system/path/$file");
}
?>

我来晚了一点,但我还是想分享这个。 我采用的方法是使用 zip 文件下载文件夹。这样做的原因是您会收到正在下载某些内容的反馈。

如果您不想这样,只需删除与 zip 相关的内容即可。然后,删除 headers 并替换为 $sftp->get("remote/file", "local/file");

<?PHP
use phpseclib\Net\SFTP;

$sftp = new SFTP("IP:Port");

if(!$sftp->login("username", "password")) throw new Exception("Connection failed");

# Create directory variable
$directory =  "/remote/path/";

# Set directory
$sftp->chdir($directory);

# File Name
$name =  'file';

# Retrieve file
$file = $sftp->get('file');

# Check if is folder
if ($sftp->is_dir($file)) {

  # Temporarily file
  $tmp = sys_get_temp_dir()."\yourSite_".rand().".zip";

  # Create new Zip Archive.
  $zip = new ZipArchive();  

  # Open new Zip file
  $zip->open($tmp,  ZipArchive::CREATE | ZipArchive::OVERWRITE);

  function recursive($src, $zip, $sftp) {

    # Loop Through files
    foreach ($sftp->nlist($src) as $file) {

     # Skip . & ..
     if ($file == "." || $file == "..") continue;

     if (!$sftp->is_file($src . "/" . $file)) {

          # Make directory
          $zip->addEmptyDir($src . "/" . $file);

          # Run the loop again
          recursive($src . "/" . $file, $zip, $sftp);

        } else {
          # Add file to zip within folder
          $zip->addFromString($src . "/" . $file,  $sftp->get($src . "/" . $file));

      }

    }

  }

  # Run Recursive loop
  recursive($name, $zip, $sftp);

  # Close zip file
  $zip->close();

  header('Content-Description', 'File Transfer');
  header('Content-type', 'application/zip');
  header('Content-Disposition', 'attachment; filename="' . $name . '.zip"');
  header('Content-length', filesize($tmp));

  echo file_get_contents($tmp);

  # Delete temporarily file
  unlink($tmp);
  return;

}

# Otherwise download single file
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=\"". $name ."\"");

echo $file;
return;