laravel12.laravel_112
R e i - D r e a m
for Laravel
TOP > Laravel Ver.12 > その他中間モジュール(FTP)
Guest
login

最終投稿日:2026年06月22日

その他中間モジュール(FTP)
FTPアダプターインストール
LaravelにFTPアダプターをインストールします。
ターミナル

C:\~\laravel_12> composer require league/flysystem-ftp "^3.0"

./composer.json has been updated
Running composer update league/flysystem-ftp
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
~ 省略 ~
82 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force
    [37;44m INFO [39;49m No publishable resources for tag [1m[laravel-assets] [22m.
Found 1 security vulnerability advisory affecting 1 package.
Run "composer audit" for a full list of advisories.

C:\~\laravel_12>

色々注意等も表示されるが、『composer.json』に以下が追記されていたら成功です。
    "league/flysystem-ftp": "^3.0",
  ※インストールは少し長いので気長に待ちましょう
FTP情報の設定
LaravelにFTP接続情報を登録する必要があるため、まずは環境ファイルへ定義します。
### FTP設定
FTP_HOST=xxx.127.xx.xxx
FTP_USERNAME=ユーザー名
FTP_PASSWORD=パスワード
FTP_ROOT=/
FTP_PORT=21
FTP制御を『Storage』クラスから利用するため、『~\config\filesystems.php』へ定義します。
filesystems.php

return [
~ 省略 ~
    'disks' => [
        'ftp' => [
            'driver' => 'ftp',
            'host' => env('FTP_HOST'),
            'username' => env('FTP_USERNAME'),
            'password' => env('FTP_PASSWORD'),
            'port' => (int)env('FTP_PORT', 21),
            'root' => env('FTP_ROOT', '/'),
            'passive' => true,
            'ignorePassiveAddress' => true,
            'ssl' => false,
            'timeout' => 30,
        ],
        ~ 省略 ~

ポート設定は数値となるためキャストする必要があります。
ポイント

configでのFTP設定に疑問を持たれた方はいませんか?
鋭い!
『何故パッシブの通信に関する設定が2つあるの?』ですよね。
確かに以下の様に2つ設定しています。
    ・'passive' => true,
    ・'ignorePassiveAddress' => true,
後者の設定は実は、Laravelの【クセ】を回避する為に必要だったりします。
前者の設定は当然『通信はパッシブだよ』を知らせます。
基本的にFTPはLinux環境のvsftpdと通信すると思いますが、これが若干曲者で、環境によって[内部IP][ローカルIP][IPv6]などを返す場合があります。
それに対し、Laravelが素直に通信をしようとするとコケる訳です。
よって先ほどの設定【ignorePassiveAddress】の出番です。
この設定は先方からの返却された通信をガン無視して『実際に接続しているIP』を使います。

FTP通信処理
○ ファイル転送(PUT)
FTP経由でファイルを送信するには『Storage』クラスを使います。
それでは任意のコントローラに処理を書いてみましょう。
FTP送信の概要は以下の通りです。
    [送信側] ~\storage\app\private\ftp\hoge.txt
    [保存先] FTPルート
任意のコントローラ

use Illuminate\Support\Facades\Storage;
~ 省略 ~

        public function index(Request $request) {
            $path = Storage::disk('local')->path('ftp/hoge.txt');
            Storage::disk('ftp')->putFileAs('/', $path, 'hoge.txt');

処理概要は以下となります。
① 送信するファイルのファイル名を含めた絶対パス取得
『Storage::disk('local')->path()』で『C:\~\storage\app\private』となります。
今回のサンプルでは、その直下の『ftp』ディレクトリに『hoge.txt』を設置しています。
② 関数『putFileAs』でFTP送信を実行します。
《引数》
    1. 送信先『FTP ROOT』ディレクトリ
    2. ①
    3. 送信先へ保存するファイル名(リネームできます)
ポイント

ファイルではなく、文字列を送信する場合は『put』関数もお手軽です。
    Storage::disk('ftp')->put('test.txt', 'テスト内容');

○ ファイル転送(GET)
FTP経由でファイルを受信するには『Storage』クラスを使います。 それでは任意のコントローラに処理を書いてみましょう。 FTP受信の概要は以下の通りです。
    [対 象] [FTPルート]/hoge.txt
    [保存先] ~\storage\app\private\ftp
任意のコントローラ

use Illuminate\Support\Facades\Storage;
~ 省略 ~

    public function index(Request $request) {
        $path = Storage::disk('local')->path('ftp/hoge.txt');
        $contents = Storage::disk('ftp')->get('FtpDir/hoge.txt');
        file_put_contents($path, $contents);

処理概要は以下となります。
① 受信し保存するファイルのファイル名を含めた絶対パス設定
『Storage::disk('local')->path()』で『C:\~\storage\app\private』となります。
今回のサンプルでは、その直下の『ftp』ディレクトリに『hoge.txt』として保存します。
② 関数『get』でリモート側の『hoge.txt』ファイルを取得します
《FTP ROOT》からの相対パスとなります。
③ 関数『file_put_contents』で①の内容でファイルを保存します
○ 転送先ファイル参照(ファイル、ディレクトリ)
FTP経由でファイル、ディレクトリ情報を参照するには『Storage』クラスを使います。 それでは任意のコントローラに処理を書いてみましょう。 FTP参照の概要は以下の通りです。
    [対 象] [FtpRoot]
任意のコントローラ

use Illuminate\Support\Facades\Storage;
~ 省略 ~

    public function index(Request $request) {
        $files = Storage::disk('ftp')->files('/');
        $dirs = Storage::disk('ftp')->allDirectories('/');

参照パスを指定するだけです。
ポイント

[ファイル][ディレクトリ]は同時に参照できないの?
実はできますが、取得結果が少し複雑です。
使用する関数は『listContents』ですが、返却はオブジェクトとなります。
配列で取得したい場合は、以下の様にしてください。
    $alls = Storage::disk('ftp')->listContents('/')->toArray();
    $files = array_filter($alls, fn($i) => $i['type'] === 'file');
    $dirs = array_filter($alls, fn($i) => $i['type'] === 'dir');

ログインしてコメントを残そう!!


きっぷる