システムは多くのファイルを扱います。画像をはじめ、PDF・Word・Excel・csvなどの様々なファイルを取り扱います。サーバーサイドはデータベースとのやりとりだけではなく、同時にこれらのファイルをサーバーにアップロードする処理を実装します。

今回は画像データをFTPサーバーにアップロードする方法を解説します。

ファイルデータの受信

送信されたファイルのデータの取得方法は下記で解説しているので、参照してください。

【CakePHP】送信されたファイルデータの中身を取得する方法

FTPサーバーに接続する

まずはデータベースに保存されているFTPの接続情報を取得して処理を実行します。今回は、コンポーネント(FTPComponent.php)で処理を行います。

接続情報を変数に格納する

まずはFTPの接続情報を用意します。値は動的に変化するのでそれぞれ変数に格納するなりして適用してください。

function ftp_connect()
{
   $ftp_host = FTPホスト;
   $ftp_user = FTPユーザー名;
   $ftp_password = FTPパスワード;
   $ftp_port = ポート番号;
   $ftp_dir = アップしたいサーバー上のディレクトリ;
}

接続する

PHPではFTPサーバーとやり取りするためのメソッドが用意されているのでそれらを使用します。解説はコメントに記載しますので順に追ってください。

// 指定したホスト名へのFTP接続をOPENする
$connection = ftp_connect($ftp_host);
if($connection === false) return false;

// FTPサーバーへのログイン処理
if(!@ftp_login($connection, $ftp_user, $ftp_password)) return false;

ここまでの記述でFTPサーバーにログインすることができます。ftp_login()の戻り値はtrue or falseなので接続に成功したかどうかの判定も行うことができます。

【各メソッド参考リンク】

ftp_connect  : https://www.php.net/manual/ja/function.ftp-connect.php

ftp_loginhttps://www.php.net/manual/ja/function.ftp-login.php

ftp_pasvhttps://www.php.net/manual/ja/function.ftp-pasv.php

FTPサーバーにファイルをアップロードする

FTPサーバーへのログインが完了したら、いよいよアップロード処理です。FTPソフトを使用してファイルをアップロードするのと同じことをプログラムで実現します。重要な記述は一行ずつ解説していきます。

ファイルデータを変数に格納する

// $fileにフロントから送信されたファイルデータが格納されていると仮定する
$file_name = $file['file']['name'];
$file_tmp_name = $file['file']['tmp_name']

パッシブモードをtrueに設定する

ftp_pasv($connection, true);

パッシブモードとは何でしょうか?

FTPには2つのモードが存在しています。

アクティブモード : サーバーからクライアントへのコネクション
パッシブモード : クライアントからサーバーへのコネクション

コネクションの方向の違いがありますが、基本的にクライアントからサーバーへのコネクションなのでtrueでOKです。

ftp_pasv() : https://www.php.net/manual/ja/function.ftp-pasv.php

ディレクトリを指定

if(!ftp_chdir($connection, $ftp_dir)) return false;

ftp_chdirの第2引数にディレクトリを渡すことで、サーバー上の指定の場所にファイルをアップロードすることができます。

ftp_chdir() : https://www.php.net/manual/ja/function.ftp-chdir.php

アップロード

ftp_put($connection, $file_name, $file_tmp_name, FTP_BINARY);

こちらも戻り値はtrue or falseなので、ファイルアップロードが成功したかを把握することができます。

【引数】

第二引数 : リモートのファイルパス
第三引数 : ローカルのファイルパス
第四引数 : バイナリモード or アスキーモードを指定

※ダウンロードにはftp_get()を使用します。
ftp_put : https://www.php.net/manual/ja/function.ftp-put.php
ftp_get : https://www.php.net/manual/ja/function.ftp-get.php

番外編 バイナリモードとアスキーモードの違い

ftp_put()の引数にはFTP_BINARYかFTP_ASCIIを記述して、転送モードを指定しなければなりません。

    • アスキーモード : 改行コードを自動的に修正して転送する
    • バイナリモード : データをそのまま転送する

セキュリティレベルの高いSFTPでは、バイナリモードしか対応していないので、ftp_put()の第4引数はFTP_BINARYの一択で良さそうです。

参考 : https://www.marineroad.com/staff-blog/20844.html

カテゴリー: PHP