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 ! 💬

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

đź‘‹ Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay