Back to Top

How to upload media through URL in Shopware 6

Updated 4 April 2023

Overview

In this article we learn about how to upload media through URL in Shopware 6.

Media Upload Method

Collect the Media URL in an array and create a media repository. We need to add to services FileFetcher and FileSaver , if you are in custom service then also register   ContinerInterface.

We recommended the following  processor

<?php

namespace Webkul\BulkUpload\Services;

use Psr\Container\ContainerInterface;
use Shopware\Core\Content\Media\File\FileFetcher;
use Shopware\Core\Content\Media\File\FileSaver;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Uuid\Uuid;
use Symfony\Component\HttpFoundation\Request;

class BulkUploadHelper 
{
    private $container;
    protected $fileFetcher;
    protected $fileSaver;

    public function __construct(
        ContainerInterface $container,
        FileFetcher $fileFetcher,
        FileSaver $fileSaver
    )
    {
        $this->container = $container;
        $this->fileFetcher = $fileFetcher;
        $this->fileSaver = $fileSaver;
    }

    public function uploadBulkImages($urlCollection, $salesChannelContext){
        $context = Context::createDefaultContext();
        $mediaRepository = $this->container->get('media.repository');
        $mediaIds = [];
        foreach($urlCollection as $url) {
            $ext = pathinfo($url, PATHINFO_EXTENSION);
            $fileName = basename($url, $ext);
            
            $request = new Request(['extension' => $ext], ['url' => $url]);
            $tempFile = tempnam(sys_get_temp_dir(), '');
            $file = $this->fileFetcher->fetchFileFromURL($request, $tempFile);
            $explodedFileName = explode('.', $fileName);
            unset($explodedFileName[count($explodedFileName) - 1]);
            $fileName = $salesChannelContext->getCustomer()->getId() . '_' . implode('.', $explodedFileName);
            $searchMedia = $mediaRepository->search((new Criteria())->addFilter(new EqualsFilter('fileName', $fileName)),$context)->first();
            if(!$searchMedia){
           
                $mediaId = Uuid::randomHex();
                $media = [
                    [
                        'id' => $mediaId,
                        'fileSize' => $file->getFileSize(),
                        'fileName' => $fileName,
                        'mimeType' => $file->getMimeType(),
                        'fileExtension' => $ext,
                    ]
                ];

                $mediaId = $mediaRepository->create($media, Context::createDefaultContext())
                    ->getEvents()
                    ->getElements()[1]
                    ->getIds()[0];
                if (is_array($mediaId)) {
                    $mediaId = $mediaId['mediaId'];
                }
            
                try {
                    $this->upload($file, $fileName, $mediaId);
                } catch (\Exception $exception) {
                    $fileName = $fileName . $mediaId;
                    $this->upload($file, $fileName, $mediaId);
                }
                array_push($mediaIds, [
                    'id' => $mediaId,
                    'title' => $fileName
                ]);
            }

        }
        return $mediaIds;
    }
    public function upload($file, $fileName, $mediaId)
    {   
        $this->fileSaver->persistFileToMedia(
            $file, 
            $fileName,
            $mediaId,
            Context::createDefaultContext()
        );
    }

}

In the above code we create a service for image upload, first of all we need to register our service into seervice.xml file for access globally. then pass argument into service, find below service.xml code..

<service id="bulkUpload.helper" class="Webkul\BulkUpload\Services\BulkUploadHelper" public="true">
   <argument type="service" id="service_container" />
   <argument type="service" id="Shopware\Core\Content\Media\File\FileFetcher"/>
    <argument type="service" id="Shopware\Core\Content\Media\File\FileSaver"/>
 </service>

passing service container, FileFetcher and FileSaver predefined services into our custom service. first of all define these service into class service constructor function for further use in our function.then create a function for upload media URL for Shopware6. Create default context object then create media repository from container. After this get extension of URL by this code pathinfo($url, PATHINFO_EXTENSION), then get filename from this method basename($url, $ext). Further create request object through URL and extension by this way new Request([‘extension’ => $ext], [‘url’ => $url]); and get tempFile of the image from this method tempnam(sys_get_temp_dir(), ”);

Start your headless eCommerce
now.
Find out More

Through FileFetcher we can get the file object of URL passing request and tempFile.

I hope it will help you. Thanks for reading 🙂

. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


Be the first to comment.

Back to Top

Message Sent!

If you have more details or questions, you can reply to the received confirmation email.

Back to Home