所以这是我的问题。在我们 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;
}
}
}
这会检查文件是否超出限制。如果是,则抛出异常。
我意识到这个解决方案很简单,这就是为什么我四处询问是否有人有更好/替代的解决方案。我期待着阅读您的答案。
最佳答案
您可以做的是向事件 controller_action_predispatch 添加一个 Observer,然后从那里仅捕获 POST 发送到扩展 Mage_Core_Controller_Front_Action 的 Controller 。
通过这种方式,您将获得发布在任何操作上的每个文件,而不必一次又一次地重做相同的工作。好处是,当使用观察者时,您不会扰乱 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>
模型/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;
}
}
}
}
}
关于php - 如何在一个 Magento 站点上设置两个最大文件大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837289/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何