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

Image of AssemblyAI tool

Challenge Submission: SpeechCraft - AI-Powered Speech Analysis for Better Communication

SpeechCraft is an advanced real-time speech analytics platform that transforms spoken words into actionable insights. Using cutting-edge AI technology from AssemblyAI, it provides instant transcription while analyzing multiple dimensions of speech performance.

Read full post

Top comments (0)

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

đź‘‹ Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay