Uploader une image à partir d'une URL est une fonctionnalité courante mais parfois complexe dans le développement web. Dans cet article, je vais vous montrer comment implémenter une solution élégante et simple dans Laravel. 🎯
🛠️ Prérequis
Avant de commencer, assurez-vous d’avoir :
- Laravel 10 ou une version supérieure.
- PHP 8.1 ou plus récent.
- Un système de stockage configuré, comme le disque public ou S3.
🎯 Objectif
Créer une classe utilitaire pour convertir une URL en un fichier téléchargeable (UploadedFile) et le stocker dans le système de fichiers configuré.
🚀 Étape 1 : Ajouter une classe utilitaire
Commençons par créer une classe qui téléchargera l'image depuis l'URL et la transformera en un objet UploadedFile.
Créez un fichier UploadedFileFromUrl.php dans le dossier app/Support
<?php
declare(strict_types=1);
namespace App\Support;
use http\Exception\RuntimeException;
use Illuminate\Http\UploadedFile;
final class UploadedFileFromUrl extends UploadedFile
{
public static function fromUrl(
string $url,
string $originalFileName,
?string $mimeType = null,
?int $error = UPLOAD_ERR_OK,
bool $test = false
): self
{
if (!$stream = @fopen($url, 'r')) {
throw new RuntimeException($url);
}
$file = tempnam(sys_get_temp_dir(), 'uploaded-file-');
file_put_contents($file, $stream);
return new self($file, $originalFileName, $mimeType, $error, $test);
}
}
Fonctionnalités principales :
- Télécharge l'image à partir de l'URL.
- Crée un fichier temporaire.
- Retourne un objet UploadedFile utilisable avec les fonctionnalités natives de Laravel, comme
store()
.
🚀 Étape 2 : Utiliser la classe dans un contrôleur
Créez un contrôleur ImageController
pour gérer l'upload et le stockage de l'image :
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Support\UploadedFileFromUrl;
use Illuminate\Http\JsonResponse;
final class ImageController extends Controller
{
public function __invoke(): JsonResponse
{
$url = 'https://placehold.it/300x300';
$fileName = 'placeholder-image.jpg';
// Créer un fichier UploadedFile à partir de l'URL
$uploadedFile = UploadedFileFromUrl::fromUrl($url, $fileName);
// Sauvegarder le fichier dans le système de stockage configuré
$path = $uploadedFile->store('public/placeholders');
return response()->json([
'message' => 'File uploaded successfully',
'path' => $path,
'url' => asset("storage/placeholders/" . basename($path)),
]);
}
}
Ce contrôleur :
- Télécharge l'image depuis une URL externe.
- Sauvegarde le fichier dans le dossier
public/placeholders
. - Retourne le chemin et l’URL du fichier dans une réponse JSON.
🚀 Étape 3 : Ajouter une route
Ajoutez une route dans routes/web.php :
use App\Http\Controllers\ImageController;
Route::get('/upload-from-url', ImageController::class);
🎉 Tester la fonctionnalité
- Démarrez le serveur de développement Laravel :
php artisan serve
- Accédez à l'URL suivante dans votre navigateur ou via un outil comme Postman :
http://127.0.0.1:8000/upload-from-url
Vous recevrez une réponse JSON ressemblant à ceci :
{
"message": "File uploaded successfully",
"path": "public/placeholders/placeholder-image.jpg",
"url": "http://127.0.0.1:8000/storage/placeholders/placeholder-image.jpg"
}
📂 Code source
Retrouvez le code complet sur GitHub : Upload Image From URL Laravel
🌟 Conclusion
En quelques étapes simples, nous avons créé une fonctionnalité puissante pour télécharger et gérer des fichiers depuis des URL dans Laravel. 🚀 Cette approche est idéale pour importer des fichiers à partir d'une source externe dans des projets de médias ou de gestion de contenu.
N'hésitez pas à poser des questions ou partager vos propres implémentations en commentaire ! 💬
Top comments (0)