Magento 2 is gaining popularity with each passing day. Many vendors decide to use this platform for their eCommerce business. Migrating data from other platforms and services has always been a popular task, but it has become even more essential today. In this article, I will demonstrate how to easily import product images from an external URL.
Magento 2 import handles saving product images pretty well, but the optimized images should already be located on your server. With the service described below, I will show you how to grab an image URL and turn it into a product image. All the necessary logic is wrapped into this service, so it can be called from your controllers, observers, via Magento 2 plugins or from any other kind of entry point that you want.
I assume you’ve already registered your extension as VendorName_ExtensionName and it is located in the app/code/VendorName/ExtensionName. The code of the service:
<?php
/**
* file location:
* app/code/VendorName/ExtensionName/Service/ImportImageService.php
*/
namespace VendorName\ExtensionName\Service;
use Magento\Catalog\Model\Product;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem\Io\File;
/**
* Class ImportImageService
* assign images to products by image URL
*/
class ImportImageService
{
/**
* Directory List
*
* @var DirectoryList
*/
protected $directoryList;
/**
* File interface
*
* @var File
*/
protected $file;
/**
* ImportImageService constructor
*
* @param DirectoryList $directoryList
* @param File $file
*/
public function __construct(
DirectoryList $directoryList,
File $file
) {
$this->directoryList = $directoryList;
$this->file = $file;
}
/**
* Main service executor
*
* @param Product $product
* @param string $imageUrl
* @param array $imageType
* @param bool $visible
*
* @return bool
*/
public function execute($product, $imageUrl, $visible = false, $imageType = [])
{
/** @var string $tmpDir */
$tmpDir = $this->getMediaDirTmpDir();
/** create folder if it is not exists */
$this->file->checkAndCreateFolder($tmpDir);
/** @var string $newFileName */
$newFileName = $tmpDir . baseName($imageUrl);
/** read file from URL and copy it to the new destination */
$result = $this->file->read($imageUrl, $newFileName);
if ($result) {
/** add saved file to the $product gallery */
$product->addImageToMediaGallery($newFileName, $imageType, true, $visible);
}
return $result;
}
/**
* Media directory name for the temporary file storage
* pub/media/tmp
*
* @return string
*/
protected function getMediaDirTmpDir()
{
return $this->directoryList->getPath(DirectoryList::MEDIA) . DIRECTORY_SEPARATOR . 'tmp';
}
}
The service can be included in any necessary place and its execute method will be called with the following params:
- $product – loaded product instance, the image will be added to it;
- $imageUrl – external image URL;
- $visible – an image will be hidden by default. You may make it visible, simply by passing boolean “true”;
- $imageType – an array, optional param, where you can specify whether to set an image as a main image, a small image or a thumbnail (or any combination of those). E.g: [‘image’, ‘small_image’, ‘thumbnail’].
Pretty simple, huh? I hope this service will spare you some time when migrating data.
Thanks for reading!
Read more:
