Uploading files to AWS S3 is a common requirement in modern Laravel applications. Amazon S3 provides scalable, secure, and cost-effective cloud storage for files such as images, documents, and media assets.
Prerequisites
- A Laravel application
- An AWS account
- An S3 bucket created in AWS
Step 1: Install AWS S3 Driver
Install the Flysystem AWS S3 package using Composer:
composer require league/flysystem-aws-s3-v3 "^3.0"
Step 2: Configure AWS Credentials
Add the following configuration values to your .env file:
AWS_ACCESS_KEY_ID=your_access_key AWS_SECRET_ACCESS_KEY=your_secret_key AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET=your_bucket_name AWS_USE_PATH_STYLE_ENDPOINT=false
Step 3: Configure the S3 Filesystem Disk
Open the config/filesystems.php file and make sure the S3 disk is configured correctly:
'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'),
],
Step 4: Create a File Upload Form
Create a simple Blade form for uploading files:
<form action="{{ route('upload') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="file" required>
<button type="submit">Upload</button>
</form>
Step 5: Handle File Upload in Controller
Create a controller method to store the uploaded file in your S3 bucket:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
public function upload(Request $request)
{
$request->validate([
'file' => 'required|file|max:2048'
]);
$path = $request->file('file')->store('uploads', 's3');
return response()->json([
'message' => 'File uploaded successfully',
'path' => $path,
'url' => Storage::disk('s3')->url($path)
]);
}
Step 6: Define the Route
Add the upload route in routes/web.php:
use App\Http\Controllers\FileController;
Route::post('/upload', [FileController::class, 'upload'])->name('upload');
Step 7: Make Files Public (Optional)
If you want uploaded files to be publicly accessible, set their visibility:
Storage::disk('s3')->setVisibility($path, 'public');
Common Issues
- Incorrect AWS credentials
- S3 bucket permission issues
- Incorrect AWS region
Conclusion
Uploading and storing files on AWS S3 in Laravel is simple using Laravel’s filesystem abstraction. With the correct configuration and security practices, S3 becomes a powerful storage solution for scalable applications.
Comments
Post a Comment