Как установить два максимальных размера файла на одном сайте Magento

Итак, вот моя проблема. В разделе администрирования нашего сайта Magento нам нужна возможность загружать файлы размером от 2-500 МБ каждый. Я правильно установил свои настройки php.ini и все хорошо с этим требованием. Но теперь меня попросили разрешить гостям загружать файлы из внешнего интерфейса. Очевидно, что я не хочу давать совершенно незнакомым людям возможность загружать 500 МБ файлов. Я искал вокруг и не смог найти достойного прямого ответа на эту проблему.

Итак, как вы позволите вашим администраторам продолжать загружать очень большие файлы, ограничивая при этом интерфейсных пользователей меньшим размером файла?

Вот мое текущее решение:

public function saveAction()
{
$post = $this->getRequest()->getPost();
$helper = Mage::helper('my_module');
if ( $post ) {
try {
if ($_FILES['size'] >= 2000000) { // Limit is set to 2 MB
$errors[] = $helper->__('You have exceeded the max file size.');
$error = true;
}
if ($error) {
throw new Exception();
}
// Perform save operations here.
} catch (Exception $e) {
foreach($errors as $error) {
Mage::getSingleton('core/session')->addError($error);
}
$this->_redirect('*/*/*');
return;
}
}
}

Это проверяет, превышает ли файл ограничение. Если это так, он выдает исключение.

Я понимаю, что это простое решение, поэтому я спрашиваю, есть ли у кого-нибудь лучшее / альтернативное решение. Я с нетерпением жду ваших ответов.

4

Решение

Что вы можете сделать, это добавить наблюдателя к событию controller_action_predispatch и оттуда ловят только POST send на расширение контроллеров Mage_Core_Controller_Front_Action,

Таким образом, вы получите все файлы, опубликованные в любом действии, и вам не придется повторять одно и то же задание снова и снова. И бонус в том, что при использовании наблюдателей вы не возитесь с Ядром Magento.

и т.д. / config.xml

<?xml version="1.0"?>
<config>
<modules>
<Bdotenoitdotbe_Module>
<version>0.0.0.1</version>
</Bdotenoitdotbe_Module>
</modules>
<global>
<models>
<bdotenoitdotbe_module>
<class>Bdotenoitdotbe_Module_Model</class>
</bdotenoitdotbe_module>
</models>
</global>
<frontend>
<events>
<controller_action_predispatch>
<observers>
<bdotenoitdotbe_module_controller_action_predispatch>
<class>bdotenoitdotbe_module/observer</class>
<method>parseFiles</method>
</bdotenoitdotbe_module_controller_action_predispatch>
</observers>
</controller_action_predispatch>
</events>
</frontend>
</config>

Модель / Observer.php

<?php
class Bdotenoitdotbe_Module_Model_Observer {
const MAX_FRONTEND_UPLOAD_SIZE = 2000000;

public function parseFiles($observer){
if($observer->getEvent()->getControllerAction() instanceof Mage_Core_Controller_Front_Action &&
$observer->getEvent()->getControllerAction()->getRequest()->isPost()) {

foreach($_FILES as $file_key => $file) {
if($file['size'] > self::MAX_FRONTEND_UPLOAD_SIZE) {
Mage::getSingleton('core/session')->addError('File too big : '.$file['name']);
/**
* you can do unset($_FILES[$file_key]);
* but I would rather do the following to simulate a file too big behaviour
*/

$file['error'] = UPLOAD_ERR_FORM_SIZE;
$file['tmp_name'] = null;
$file['size'] = 0;
$_FILES[$file_key] = $file;

}
}
}
}
}
1

Другие решения

upload_max_filesize — это запись PHP_INI_PERDIR. Это означает, что это значение может быть установлено в php.ini, .htaccess, httpd.conf или .user.ini (начиная с PHP 5.3). Вы не можете использовать ini_set в php файле для этого.
Не уверен насчет Apache, но вот как это сделать для Nginx:

  1. установить upload_max_filesize = 10M в php.ini
  2. добавить следующие строки в конфиге Nginx внутри location ~ \.php$ блок

    if ($request_uri ~ /admin/){
    client_max_body_size 500m;
    }
    

    или же

    if ($request_uri ~ /admin/) {
    fastcgi_param PHP_VALUE "upload_max_filesize = 500M \n post_max_size=500M";
    }
    

    Примечание: / admin / — это значение из admin> маршруты> adminhtml> аргументы> имя_файла в magento_root / app / etc / local.xml

  3. перезапустите Nginx

1

По вопросам рекламы [email protected]