Magento 1中PHP filesize获取媒体目录文件大小失败排查
解决Magento中filesize函数无法正确显示文件大小的问题
嘿,我来帮你排查下问题所在,你的代码主要有几个容易踩坑的地方,咱们一个个说:
1. 路径拼接的致命错误
你定义的$file = '/h/p/file.pdf'开头带了个斜杠,和后面的../media/catalog拼接后,PHP会直接忽略前面的相对路径!因为当拼接的路径中后面部分是**绝对路径开头(带/)**时,前面的相对路径会被覆盖,实际执行的路径变成了/h/p/file.pdf,这显然不是你要的Magento media目录下的文件,肯定找不到啊!
解决办法:把$file开头的斜杠去掉,改成$file = 'h/p/file.pdf',这样拼接后才是正确的相对路径../media/catalog/h/p/file.pdf。
2. 直接输出filesize结果是字节,不是MB
就算路径对了,filesize()返回的是文件的字节数,你直接echo出来的只是一串数字,不是你想要的MB单位,必须做单位转换才行。
3. 相对路径不靠谱,用Magento内置方法更稳妥
硬编码相对路径很容易出问题——比如你的脚本如果不在Magento根目录下,../media/catalog就会指向错误的位置。最好用Magento提供的方法获取媒体目录的绝对路径,彻底避免路径错误:
Magento 1 示例代码:
<?php // 去掉$file开头的斜杠,确保是相对catalog目录的路径 $file = 'h/p/file.pdf'; // 用Magento内置方法获取media目录绝对路径,再拼接完整路径 $fullPath = Mage::getBaseDir('media') . DS . 'catalog' . DS . $file; // 先检查文件是否存在且可读,避免报错 if (file_exists($fullPath) && is_readable($fullPath)) { // 把字节转换为MB,保留两位小数 $sizeMB = filesize($fullPath) / (1024 * 1024); echo number_format($sizeMB, 2) . ' MB'; } else { echo '文件不存在或无法读取,请检查路径和权限'; } ?>
Magento 2 示例代码(在自定义块类中使用):
<?php use Magento\Framework\Filesystem; class YourCustomBlock extends \Magento\Framework\View\Element\Template { protected $_mediaDirectory; public function __construct( \Magento\Framework\View\Element\Template\Context $context, Filesystem $filesystem, array $data = [] ) { $this->_mediaDirectory = $filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA); parent::__construct($context, $data); } public function getFileSize() { $file = 'h/p/file.pdf'; $fullPath = $this->_mediaDirectory->getAbsolutePath('catalog/' . $file); if (file_exists($fullPath) && is_readable($fullPath)) { $sizeMB = filesize($fullPath) / (1024 * 1024); return number_format($sizeMB, 2) . ' MB'; } return '文件不存在或无法读取'; } }
4. 别忘了检查文件权限
如果路径改对了还是不行,得确认Magento的media/catalog/h/p/目录和file.pdf文件的权限是否正确——PHP进程需要有读取该文件的权限,一般设置为目录755、文件644就可以。
总结一下:先修正路径的斜杠问题,用Magento内置方法构建绝对路径,转换字节到MB单位,再加个错误检查,这样就能正常显示文件大小了!
内容的提问来源于stack exchange,提问作者JGeer
相关产品推荐
相关产品推荐

