如何在一个 Magento 站点上设置两个最大文件大小限制
How to have two max file size limits on one Magento site
这就是我的问题。在我们 Magento 站点的管理部分,我们需要能够上传每个 2-500 MB 的文件。我已经适当地设置了我的 php.ini 设置,一切都符合这个要求。但是现在我被要求允许客人从前端上传文件。显然,我不想让完全陌生的人上传 500 MB 的文件。我四处搜索,但未能找到该问题的合适直接答案。
那么如何让您的管理员继续上传超大文件,同时限制前端用户只能上传较小的文件?
这是我目前的解决方案:
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;
}
}
}
这会检查文件是否超出限制。如果是,则抛出异常。
我意识到这个解决方案很简单,这就是为什么我四处询问是否有人有 better/alternative 解决方案的原因。我期待着阅读您的答案。
您可以做的是向事件 controller_action_predispatch
添加一个观察者,然后从那里仅捕获 POST 发送到扩展 Mage_Core_Controller_Front_Action
.
的控制器
这样您就可以在任何操作上发布每个文件,而不必一次又一次地重做相同的工作。好处是,当使用观察者时,您不会弄乱 Magento 的核心。
etc/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>
Model/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;
}
}
}
}
}
upload_max_filesize 是 PHP_INI_PERDIR 项。这意味着这个值可以在 php.ini、.htaccess、httpd.conf 或 .user.ini 中设置(自 PHP 5.3 起)。为此,您不能在 php 文件中使用 ini_set。
不确定 Apache,但这里是 Nginx 的操作方法:
- 在php.ini
中设置upload_max_filesize=10M
在 location ~ \.php$
块内的 Nginx 配置中添加下一行
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/ 是 magento_root/app/etc/local.xml
中 admin > routes > adminhtml > args > frontName 的值
重启Nginx
这就是我的问题。在我们 Magento 站点的管理部分,我们需要能够上传每个 2-500 MB 的文件。我已经适当地设置了我的 php.ini 设置,一切都符合这个要求。但是现在我被要求允许客人从前端上传文件。显然,我不想让完全陌生的人上传 500 MB 的文件。我四处搜索,但未能找到该问题的合适直接答案。
那么如何让您的管理员继续上传超大文件,同时限制前端用户只能上传较小的文件?
这是我目前的解决方案:
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;
}
}
}
这会检查文件是否超出限制。如果是,则抛出异常。
我意识到这个解决方案很简单,这就是为什么我四处询问是否有人有 better/alternative 解决方案的原因。我期待着阅读您的答案。
您可以做的是向事件 controller_action_predispatch
添加一个观察者,然后从那里仅捕获 POST 发送到扩展 Mage_Core_Controller_Front_Action
.
这样您就可以在任何操作上发布每个文件,而不必一次又一次地重做相同的工作。好处是,当使用观察者时,您不会弄乱 Magento 的核心。
etc/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>
Model/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;
}
}
}
}
}
upload_max_filesize 是 PHP_INI_PERDIR 项。这意味着这个值可以在 php.ini、.htaccess、httpd.conf 或 .user.ini 中设置(自 PHP 5.3 起)。为此,您不能在 php 文件中使用 ini_set。 不确定 Apache,但这里是 Nginx 的操作方法:
- 在php.ini 中设置upload_max_filesize=10M
在
location ~ \.php$
块内的 Nginx 配置中添加下一行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/ 是 magento_root/app/etc/local.xml
中 admin > routes > adminhtml > args > frontName 的值
重启Nginx