PG WORKS

PHPやLinux(サーバー)などのノウハウや、便利なツールを紹介していきます。

【PHP】FTPアップロード機能を作ろう。

体調元に戻ったのですが、久々にモンスターエナジー飲んだらお腹の調子が悪いZENです(汗

今回のプログラム紹介記事は、ファイルのアップロード機能になります。

また、プログラムのサンプルですが、comeonly様から、少しプログラムを変更しての紹介です。
comeonly.hatenablog.com

FTPアップロード関数

<?php
/**
 * 指定したファイルをアップロード
 * $ftp ↓配列の中身
 *   ftp_server
 *   ftp_user_name
 *   ftp_user_pass
 * $remote_file アップロード先
 * $file アップロードするファイルorディレクトリ
 **/
function FTPuploads($ftp, $remote_file, $file) {
  // 接続を確立する
  $conn_id = ftp_connect(trim($ftp['ftp_server']));
  ftp_pasv($conn_id, true);	
  if (!$conn_id) {
    die($ftp['ftp_server'].'接続できません' . "\n");
  }
	
  // ユーザ名とパスワードでログインする
  $login_result = ftp_login($conn_id, trim($ftp['ftp_user_name']), trim($ftp['ftp_user_pass']));

  if (!$login_result) {
    die('ログインできません'.$ftp['ftp_server']. "\n");
  }
	
  // フォルダの場合作成
  if( is_dir($file) ) {
    $contents_on_server = ftp_nlist($conn_id, $remote_file);
    if(!in_array($remote_file."/.", $contents_on_server)) {
      if(!ftp_mkdir($conn_id, $remote_file)) {
        echo "There was a problem while creating $file\n";
        exit;
      }
    }

  // ファイルをアップロードする
  } else {
    if (!ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
      echo "There was a problem while uploading $file\n";
      exit;
    }
  }

  // 接続を閉じる
  ftp_close($conn_id);
}

/**
 * 指定したディレクトリの一括アップロード
 **/
function AllFTPUpload( $ftp, $targetDir, $subPath="" ) {
  $aryDirs = list_targetfiles($targetDir);
  if( is_array($aryDirs) ) {
    foreach( $aryDirs as $dvals ) {
      $filePaths = str_replace($targetDir, "", $dvals);
      FTPuploads($ftp,$subPath.$filePaths,$dvals);
    }
  }
}
/**
 * 全ての階層のファイル/フォルダを取得する
 * $dir 指定したディレクトリの全階層取得
 * 
 **/
function list_targetfiles($dir){
   $files = array();
   $list = scandir($dir);
   $aryNotDir = array("design");
   foreach($list as $file) {
     if($file == '.' || $file == '..') {
        continue;
     } else if(is_file($dir . $file)) {
        $files[] = $dir . $file;
     } else if(is_dir($dir . $file)) {
        $files[] = $dir . $file;
        $files = array_merge($files, list_files($dir . $file . '/'));
     }
   }
  return $files;
}
?>

指定した、ディレクトリを一括でアップロードできるように変更してみました。

特定のファイルだけアップロードする場合は「FTPuploads」関数のみで、ディレクトリにある中身すべてをアップロードする場合は、「AllFTPUpload」を使用する形です。

アップロード完了後、元ファイルを削除したい場合、でじうぃき様のファイル削除関数を使用すると便利です。
onlineconsultant.jp