Laravelでのファイル操作：基本から応用まで

# はじめに
こんにちは、Webエンジニアの岩田史門([@SI_Monxy](https://x.com/SI_Monxy))です！
今回はLaravelでのファイル操作について記事を書いてみました！
改善点や修正点があれば、コメントにて優しくご指導いただけると嬉しいです！

# 概要
ファイル操作はWebアプリケーションにおいて非常に重要な役割を果たします。Laravelは、ファイル操作を簡単かつ効率的に行うための豊富な機能を提供しています。本記事では、Laravelを使用してファイル操作を行うための基本から応用までを解説します。

# ファイル操作の基本
Laravelでは、Storageファサードを使用してファイル操作を簡単に行うことができます。基本的なファイル操作を見ていきましょう。

``` php
use Illuminate\Support\Facades\Storage;

// ファイルの存在チェック
if (Storage::exists('file.txt')) {
    echo 'File exists.';
}

// ファイルの取得
$contents = Storage::get('file.txt');

// ファイルの保存
Storage::put('file.txt', 'Contents');

// ファイルの追加
Storage::append('file.txt', 'Appended contents.');

// ファイルのコピー
Storage::copy('file.txt', 'copy_of_file.txt');

// ファイルの移動
Storage::move('file.txt', 'new_file.txt');
```

# ストレージの設定
Laravelは、ローカルストレージ、S3、FTPなど、さまざまなストレージドライバーをサポートしています。設定はconfig/filesystems.phpで行います。

``` php
'disks' => [
    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

    's3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
    ],
],
```

# ファイルのアップロード
ファイルアップロードは、フォームを介して行います。以下は、アップロードの例です。

## コントローラー
``` php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

public function upload(Request $request)
{
    if ($request->hasFile('file') && $request->file('file')->isValid()) {
        $path = $request->file('file')->store('uploads');
        return 'File uploaded to: ' . $path;
    }

    return 'No file uploaded or file is not valid.';
}
```

## ビュー
``` html
<form action="/upload" method="POST" enctype="multipart/form-data">
    @csrf
    <input type="file" name="file">
    <button type="submit">Upload</button>
</form>
```

# ファイルのダウンロード
ファイルのダウンロードは、response()->downloadメソッドを使用して行います。
``` php
use Illuminate\Support\Facades\Storage;

public function download($filename)
{
    return response()->download(storage_path("app/{$filename}"));
}
```

# ファイルの表示
ファイルをブラウザ上で表示するには、response()->fileメソッドを使用します。
``` php
use Illuminate\Support\Facades\Storage;

public function show($filename)
{
    return response()->file(storage_path("app/{$filename}"));
}
```

# ファイルの削除
ファイルの削除は、Storage::deleteメソッドを使用します。
``` php
use Illuminate\Support\Facades\Storage;

public function delete($filename)
{
    if (Storage::exists($filename)) {
        Storage::delete($filename);
        return 'File deleted.';
    }

    return 'File not found.';
}
```

# ディレクトリ操作
Laravelでは、ディレクトリの作成やファイルのリスト取得も簡単に行えます。

``` php
use Illuminate\Support\Facades\Storage;

// ディレクトリの作成
Storage::makeDirectory('new_directory');

// ファイルのリスト取得
$files = Storage::files('directory_name');
$allFiles = Storage::allFiles('directory_name');

// ディレクトリの削除
Storage::deleteDirectory('directory_name');
```

# 応用：ファイルの暗号化と復号化
ファイルのセキュリティを強化するために、暗号化と復号化を行うことができます。

``` php
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Crypt;

// ファイルの暗号化
$content = 'Secret content';
$encrypted = Crypt::encrypt($content);
Storage::put('encrypted.txt', $encrypted);

// ファイルの復号化
$encryptedContent = Storage::get('encrypted.txt');
$decrypted = Crypt::decrypt($encryptedContent);
```

# 応用：CSVファイルの操作
CSVファイルの読み書きも簡単に行えます。以下は、CSVファイルの書き込みと読み込みの例です。

## 書き込み

``` php
use Illuminate\Support\Facades\Storage;

$data = [
    ['Name', 'Email', 'Age'],
    ['John Doe', 'john@example.com', 25],
    ['Jane Doe', 'jane@example.com', 30],
];

$csv = fopen(storage_path('app/data.csv'), 'w');
foreach ($data as $row) {
    fputcsv($csv, $row);
}
fclose($csv);
```

### 読み込み
``` php
use Illuminate\Support\Facades\Storage;

$csv = fopen(storage_path('app/data.csv'), 'r');
while (($row = fgetcsv($csv)) !== false) {
    print_r($row);
}
fclose($csv);
```

# まとめ
Laravelを使用することで、ファイル操作は非常に簡単かつ効率的に行うことができます。基本的なファイル操作から、暗号化やCSVファイルの操作まで、多くの機能を提供しています。

# 参考URL
- [Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/8.x/filesystem)
- [Laravel File Storage](https://laravel.com/docs/11.x/filesystem)