Overview
In this article we learn about how to upload media through URL in Shopware6.
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(), ”);
Through FileFetcher we can get the file object of URL passing request and tempFile.
I hope it will help you. Thanks for reading