A little blog on how to use the file-uploader.js uicomponent.
Case: Let’s say you want customers to be able to upload a csv with products and qty to order.
Step 1: Your phtml
In your .phtml you can use the following code snippet to initiate a ajax file uploader.
<div class="upload-wrapper" data-bind="scope: 'uploader'"> <!-- ko template: getTemplate() --><!-- /ko --> </div> <script type="text/x-magento-init"> { ".upload-wrapper": { "Magento_Ui/js/core/app": { "components": { "uploader": { "component": "Magento_Ui/js/form/element/file-uploader", "template": "ui/form/element/uploader/uploader", "allowedExtensions": "csv", "uploaderConfig": { "url": "<?php echo $block->getUrl('{router}/{controller}/upload'); ?>" } } } } } } </script>
Tip: The uploader comes with a nice #dropzone which you can style.
Checkpoint 1: When u drag in or upload a csv file, and you monitor you ajax calls in your browser extension, you will see a files post to the configured controller.
Step 2: Your controller
<?php namespace Experius\CodeBlogFrontendFileUploader\Controller\Upload; class Ajax extends \Magento\Framework\App\Action\Action { protected $resultPageFactory; protected $jsonHelper; /** * Constructor * * @param \Magento\Framework\App\Action\Context $context * @param \Magento\Framework\Json\Helper\Data $jsonHelper */ public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\View\Result\PageFactory $resultPageFactory, \Magento\Framework\Json\Helper\Data $jsonHelper ) { $this->resultPageFactory = $resultPageFactory; $this->jsonHelper = $jsonHelper; parent::__construct($context); } /** * Execute view action * * @return \Magento\Framework\Controller\ResultInterface */ public function execute() { $error = false; // Do something with the file post var_dump($_FILES['files']) $result = ['error'=>$error,'success'=> ($error) ? false : true ]; try { return $this->jsonResponse($result); } catch (\Magento\Framework\Exception\LocalizedException $e) { return $this->jsonResponse($e->getMessage()); } catch (\Exception $e) { $this->logger->critical($e); return $this->jsonResponse($e->getMessage()); } } /** * Create json response * * @return \Magento\Framework\Controller\ResultInterface */ public function jsonResponse($response = '') { return $this->getResponse()->representJson( $this->jsonHelper->jsonEncode($response) ); } }
Checkpoint 2: The response of the ajax of the upload should be valid now.