DEV Community

A0mineTV
A0mineTV

Posted on

🚀 Upload d'images à partir d'une URL dans Laravel

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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)),
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

🎉 Tester la fonctionnalité

  1. Démarrez le serveur de développement Laravel :
php artisan serve
Enter fullscreen mode Exit fullscreen mode
  1. Accédez à l'URL suivante dans votre navigateur ou via un outil comme Postman :
http://127.0.0.1:8000/upload-from-url
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

📂 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)