如何在一个Magento站点上拥有两个最大文件大小限制

时间:2015-04-24 01:43:25

标签: php magento file-upload filesize

所以这是我的问题。在我们的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;
        }
    }
}

检查文件是否超出限制。如果是,则抛出异常。

我意识到这个解决方案很简单,这就是为什么我在询问是否有人有更好的/替代解决方案。我期待着阅读你的答案。

2 个答案:

答案 0 :(得分:1)

您可以做的是向事件controller_action_predispatch添加一个观察者,并从那里只捕获POST发送到扩展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 :(得分:1)

upload_max_filesize是PHP_INI_PERDIR条目。这意味着可以在php.ini,.htaccess,httpd.conf或.user.ini中设置此值(自PHP 5.3起)。你不能在php文件中使用ini_set。 不确定Apache,但这里是Nginx的方法:

  1. 在php.ini中设置upload_max_filesize = 10M
  2. 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 /是来自admin的值&gt;路线&gt; adminhtml&gt; args&gt; magento_root / app / etc / local.xml

  3. 中的frontName
  4. 重启Nginx