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.

