簡體   English   中英

使用 phpseclib Net_SFTP.get 下載文件夾不起作用

[英]Downloading a folder with phpseclib Net_SFTP.get does not work

我正在嘗試使用 phpseclib 訪問 SFTP 文件夾服務器中的文件。 但是當我嘗試使用$sftp->get ,它返回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 文件,但也想知道如果它在文件夾中,我如何獲得多個文件。

這是服務器結構的圖片:

結構體

通常,當我使用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.

Net_SFTP.get方法只能下載單個文件。 您不能使用它來下載整個目錄。

如果要下載整個目錄,則必須使用“列表”方法之一( Net_SFTP.nlistNet_SFTP.rawlist )來檢索文件列表,然后逐個下載文件。

<?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 相關的內容以及刪除標題並將其替換為$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));

      }

    }

  }

  # 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);

  unlink($tmp);
  return;

}

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

echo $file;
return;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM