在Magento PHP中显示之前检查文件是否存在?
我能够获得文件的web路径,如下所示:在Magento PHP中显示之前检查文件是否存在?,php,file,magento,Php,File,Magento,我能够获得文件的web路径,如下所示: $filename = 'elephant.jpg'; $path_to_file = $this->getSkinUrl('manufacturertab'); $full_path = $path_to_file . '/' . $filename; 但是如果文件不存在,那么我最终会得到一个断开的图像链接 我试过这个: if(!file_exists($full_path)) { Mage::log('File doesn\'t exist
$filename = 'elephant.jpg';
$path_to_file = $this->getSkinUrl('manufacturertab');
$full_path = $path_to_file . '/' . $filename;
但是如果文件不存在,那么我最终会得到一个断开的图像链接
我试过这个:
if(!file_exists($full_path)) {
Mage::log('File doesn\'t exist.');
} else {
?><img src="<?php echo $full_path ?>" /><?php
}
它看起来对称,便于携带
或
2.)
是否有一些PHP或Magento函数用于检查远程资源是否存在?但这似乎是一种浪费,因为资源实际上是本地的。PHP使用http方法检查本地文件是愚蠢的,不是吗
我当前使用的解决方案:
$system_path = Mage::getBaseDir('skin') . '/frontend/default/mytheme/manufacturertab'; // portable, but not pretty
$file_path = $system_path . '/' . $filename;
然后检查文件\u是否存在
,如果存在,则显示img
。但是,我不喜欢必须为系统路径硬编码部分路径和为url路径使用方法之间的不对称性。最好能有一个同时适用于两者的方法。您可以使用
$thumb_image = file_get_contents($full_path) //if full path is url
//then check for empty
if (@$http_response_header == NULL) {
// run check
}
您也可以使用curl或尝试此链接功能
$localPath = Mage::getSingleton( 'core/design_package' )->getFilename( 'manufacturertab/' . $filename, array( '_type' => 'skin', '_default' => false ) );
将返回与相同的路径
$urlPath = $this->getSkinUrl( 'manufacturertab/' . $filename );
但是在本地文件系统上。您可以省略'_default'=>false参数,它仍然可以工作(我之所以将其保留在那里,是因为getSkinUrl也将其设置为内部)
请注意,getSkinUrl和getFilename的参数可以是文件或目录,但应始终使用整个路径(使用文件名),以便回退机制正常工作
考虑一下情况
皮肤/default/default/manufacturertab/a.jpg
皮肤/yourtheme/default/manufacturertab/b.jpg
在这种情况下,如果将文件名作为参数提供,则对getSkinUrl或getFilename的调用将在这两种情况下返回到a.jpg和b.jpg的路径,但对于仅设置文件夹名的情况,将在这两种情况下返回skin/yourtheme/default/manufacturertab/,并且在附加文件名并检查a.jpg时,将进行检查失败。这就是为什么您应该始终提供整个路径作为参数的原因
您仍然需要使用自己的函数检查文件是否存在,因为如果文件不存在,getFilename函数将返回默认路径(如果manufacturertab/foo.jpg不存在,则返回skin/default/default/manufacturertab/foo.jpg)。它帮助我:
$url = getimagesize($imagepath); //print_r($url); returns an array
if (!is_array($url))
{
//if file does not exists
$imagepath=Mage::getDesign()->getSkinUrl('default path to image');
}
Mage::getBaseDir()
就是您想要的。对于您的场景,getSkinBaseDir()
将执行更好的工作
$filename = 'elephant.jpg';
$full_path = Mage::getDesign()->getSkinBaseDir().'/manufacturertab/'.$filename;
$full_URL=$this->getSkinUrl('manufacturertab/').$filename;
if(!is_file($full_path)) {
Mage::log('File doesn\'t exist.');
} else {
?><img src="<?php echo $full_URL ?>" /><?php
}
$filename='elephant.jpg';
$full_path=Mage::getDesign()->getSkinBaseDir()。/manufacturertab/。$filename;
$full_URL=$this->getSkinUrl('manufacturertab/')。$filename;
如果(!is_文件($full_路径)){
Mage::log('文件不存在');
}否则{
?>“/>您可以使用以下选项:
$file = 'http://mysite.co.za/files/image.jpg';
$file_exists = (@fopen($file, "r")) ? true : false;
当我试图检查URL上是否存在图像时,这对我很有用。谢谢。不过我不想使用HTTP方法。当它是本地文件时,这似乎是一种浪费。不管怎样+1。你可以给本地主机路径。是的,我猜如果启用了环回,对吗?当有本地文件时,使用它仍然感觉很奇怪。这似乎不是正确的方法,不是吗o do it.whwt警告您?我在这里试图做的部分工作是编写代码,如果我将站点传输到另一个具有不同文件层次结构的服务器,这些代码仍然可以工作。您说的是使用$filename
中的完整路径,但我从哪里获得完整路径?我没有说$filename中的完整路径与文件系统根目录中的路径相同。我的意思是,您不应该编写$file\u path=$this->getSkinUrl('manufacturertab')./'.$filename;
,而是应该编写$file\u path=$this->getSkinUrl('manufacturertab/'.filename);
因为这使得getSkinUrl函数不仅可以检查文件夹是否存在,还可以检查文件是否存在。getFilename函数也是如此。请注意,路径没有改变-唯一改变的是,调用函数之前还是之后,是否连接了skin文件夹中的名称和相对路径。
$filename = 'elephant.jpg';
$full_path = Mage::getDesign()->getSkinBaseDir().'/manufacturertab/'.$filename;
$full_URL=$this->getSkinUrl('manufacturertab/').$filename;
if(!is_file($full_path)) {
Mage::log('File doesn\'t exist.');
} else {
?><img src="<?php echo $full_URL ?>" /><?php
}
$file = 'http://mysite.co.za/files/image.jpg';
$file_exists = (@fopen($file, "r")) ? true : false;