How to add custom option(field) where when customer create his/her account he/she can upload his her image and also in edit file he/she can resize or manipulate this image
Magento – How to add custom field to upload image in registration.phtml file
imageimage-uploadmagento-1.9
Related Solutions
Finally i found solution for more than one image upload in that custom form.Its simple concept for adding image upload more than one in custom form.Here following procedure for that image upload concept:
Step:1
Image file : Block/Adminhtml/Next/Edit/Tab/Image.php
add custom image field tag in that image file.
[...]
$fieldset->addField('collar_image', 'image', array(
'name' => 'collar_image',
'label' => Mage::helper('measurement_setter')->__('collar Image'),
'title' => Mage::helper('measurement_setter')->__('collar Image'),
'required' => true,
'disabled' => $isElementDisabled
));
[...]
Step:2
Controller File: controllers/Adminhtml/[ModuleName]Controller.php
Add that below line into saveAction()
function.
//Assign that values
if (isset($data['collar_image'])) {
$collar_imageData = $data['collar_image'];
unset($data['collar_image']);
} else {
$collar_imageData = array();
}
//collar Remove Image
if (isset($collar_imageData['delete']) && $model->getCollar_image()) {
$imageHelper->removeImage($model->getCollar_image());
$model->setCollar_image(null);
}
//Upload new Collar Image upload tag
$imageFile = $imageHelper->uploadImage('collar_image');
if ($imageFile) {
if ($model->getCollar_image()) {
$imageHelper->removeImage($model->getCollar_image());
}
$model->setCollar_image($imageFile);
}
And then you can clear cache and index section in Var/Cache
and Var/Index
.
NOTICE:
[Modulename] =>your module name
You need to create a class to handle your image upload field and show the image once is uploaded.
So create [Namespace]\[Module]\Block\Adminhtml\[Entity]\Helper\Image
class
<?php
namespace [Namespace]\[Module]\Block\Adminhtml\[Entity]\Helper;
use Magento\Framework\Data\Form\Element\Image as ImageField;
use Magento\Framework\Data\Form\Element\Factory as ElementFactory;
use Magento\Framework\Data\Form\Element\CollectionFactory as ElementCollectionFactory;
use Magento\Framework\Escaper;
use [Namespace]\[Module]\Model\[Entity]\Image as [Entity]Image;
use Magento\Framework\UrlInterface;
/**
* @method string getValue()
*/
class Image extends ImageField
{
/**
* image model
*
* @var \[Namespace]\[Module]\Model\[Entity]\Image
*/
protected $imageModel;
/**
* @param [Entity]Image $imageModel
* @param ElementFactory $factoryElement
* @param ElementCollectionFactory $factoryCollection
* @param Escaper $escaper
* @param UrlInterface $urlBuilder
* @param array $data
*/
public function __construct(
[Entity]Image $imageModel,
ElementFactory $factoryElement,
ElementCollectionFactory $factoryCollection,
Escaper $escaper,
UrlInterface $urlBuilder,
$data = []
)
{
$this->imageModel = $imageModel;
parent::__construct($factoryElement, $factoryCollection, $escaper, $urlBuilder, $data);
}
/**
* Get image preview url
*
* @return string
*/
protected function _getUrl()
{
$url = false;
if ($this->getValue()) {
$url = $this->imageModel->getBaseUrl().$this->getValue();
}
return $url;
}
}
then create the class that will help you retrieve the image upload path and upload dir
<?php
namespace [Namespace]\[Module]\Model\[Entity];
use Magento\Framework\UrlInterface;
use Magento\Framework\Filesystem;
use Magento\Framework\App\Filesystem\DirectoryList;
class Image
{
/**
* media sub folder
* @var string
*/
protected $subDir = '[namespace]/[module]/[entity]';
/**
* url builder
*
* @var \Magento\Framework\UrlInterface
*/
protected $urlBuilder;
/**
* @var \Magento\Framework\Filesystem
*/
protected $fileSystem;
/**
* @param UrlInterface $urlBuilder
* @param Filesystem $fileSystem
*/
public function __construct(
UrlInterface $urlBuilder,
Filesystem $fileSystem
)
{
$this->urlBuilder = $urlBuilder;
$this->fileSystem = $fileSystem;
}
/**
* get images base url
*
* @return string
*/
public function getBaseUrl()
{
return $this->urlBuilder->getBaseUrl(['_type' => UrlInterface::URL_TYPE_MEDIA]).$this->subDir.'/image';
}
/**
* get base image dir
*
* @return string
*/
public function getBaseDir()
{
return $this->fileSystem->getDirectoryWrite(DirectoryList::MEDIA)->getAbsolutePath($this->subDir.'/image');
}
}
now in your edit for tab add this in the method _prepareForm
right after declaring the fieldset
$fieldset->addType('image', '\[Namespace]\[Module]\Block\Adminhtml\[Entity]\Helper\Image');
and add your image field like this
$fieldset->addField(
'image_field_name',
'image',
[
'name' => 'image_field_name',
'label' => __('Image field Label'),
'title' => __('Image field Label'),
]
);
In the controller that saves your entity you need to inject in the constructor the following classes
Magento\MediaStorage\Model\File\UploaderFactory
and [Namespace]\[Module]\Model\[Entity]\Image
So make your class look like this
<?php
use Magento\Framework\Exception\LocalizedException as FrameworkException;
class ....
protected $uploaderFactory;
protected $imageModel;
public function __construct(
....
\Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
\[Namespace]\[Module]\Model\[Entity]\Image $imageModel,
....
){
...
$this->uploaderFactory = $uploaderFactory;
$this->imageModel = $imageModel;
...
}
Now, in the same controller add this, before calling $[entity]->save()
$imageName = $this->uploadFileAndGetName('image_field_name', $this->imageModel->getBaseDir(), $data);
$[entity]->setImageFieldName($imageName);
and create this method:
public function uploadFileAndGetName($input, $destinationFolder, $data)
{
try {
if (isset($data[$input]['delete'])) {
return '';
} else {
$uploader = $this->uploaderFactory->create(['fileId' => $input]);
$uploader->setAllowRenameFiles(true);
$uploader->setFilesDispersion(true);
$uploader->setAllowCreateFolders(true);
$result = $uploader->save($destinationFolder);
return $result['file'];
}
} catch (\Exception $e) {
if ($e->getCode() != \Magento\Framework\File\Uploader::TMP_NAME_EMPTY) {
throw new FrameworkException($e->getMessage());
} else {
if (isset($data[$input]['value'])) {
return $data[$input]['value'];
}
}
}
return '';
}
A full example on how to create an entity that supports image and file upload (it's a bit different than described here as it contains an extra class for upload) can be found here
Best Answer
There is free extension available for that
http://www.magentocommerce.com/magento-connect/avatar.html
If you want to customize then you can try below link
https://stackoverflow.com/questions/9800766/customer-image-upload-and-resize-in-magento