将文件上传到Web服务器后,php文件无法加载某些图像

时间:2014-09-08 19:07:00

标签: php ftp hosting

在将项目上传到Web服务器(godaddy.com)之后,我偶然发现了以下问题:由于某些未知原因,img.php无法加载一些随机格式的图像(jpg / png)。我假设一切都以正确的方式完成,因为一切都在我的本地机器上正常工作。我使用WinSCP上传文件。在(ftp)上传期间,我没有收到任何错误。

我没有从php或浏览器控制台得到任何错误或警告(这就是为什么我很困惑)。

我做错了什么(我不知道)或者我应该联系godaddy.com吗?

img.php代码:

<?php
#   FILE USED TO LOAD IMAGES.
if(isset($_GET['type'],$_GET['f'])){
    #   ATTEMPT TO LOCATE FILE
    $dir=array();
        $dir['path']='src/'.$_GET['type'].'/';
        $dir['files']=scandir($dir['path']);
    foreach($dir['files'] as$i=>$val){
        $fNameArr=explode('.',$val);
        if($fNameArr[0]==$_GET['f'] && pathinfo($dir['path'].$val,PATHINFO_EXTENSION)==$_GET['type']){
            #   FILE FOUND. SEND RIGHT HEADER.
            switch(pathinfo($dir['path'].$val,PATHINFO_EXTENSION)){
                case'png':
                    header('Content-type:image/png', true);
                    break;
                case('jpg' OR 'jpeg'):
                    header('Content-type:image/jpg', true);
                    break;
                case'gif':
                    header('Content-type:image/gif', true);
                    break;
            }
            require_once($dir['path'].$val);
        }
    }
    unset($dir);
}else{
    #   SELF EXPLANATORY ERROR
    die('ERROR: dependencies missing!');
}
?>

项目的实时版本: www.ekodom.com/v3/(警告:CSS尚未完成。可能在某些浏览器中无法正常工作)

附加信息:对于通过css.php加载的一些.css文件显然也是如此,它们以类似的方式工作(加载.css标头并包含.css文件);

3 个答案:

答案 0 :(得分:1)

这完全是错误的:

  case('jpg' OR 'jpeg'):

case值不能是表达式。这个or语句实际上等同于

  case true:

你应该

  case 'jpg':
  case 'jpeg':

代替。

switch($foo) {
    case 'bar':
       ...
    case 'baz':

实际上相当于

 if ($foo == 'bar') {
      ....
 } else if ($foo == 'baz') {
       ....
 }

使用or版本,

 if ($foo == ('A' or 'B')) {

编译为

 if ($foo == true) {

然后到

 if ($foo) 

答案 1 :(得分:0)

你没有做错任何事。实际上,具有自己的PHP设置的服务器具有不同的模式,即将图像直接输出到具有图像类型标题的浏览器中。 我对2-3种不同类型的主机有同样的问题,因为相同的代码适用于特定的主机,而其他主机则没有。

主要是我不知道为什么,但后来我发现它取决于特定的图像功能和它们的设置是由这些主机在幕后完成的。它还涉及它们使用的编码类型,以及它们与输出缓冲区一起使用的输出流模式。

如果您想坚持使用此主机,请与他们的技术团队联系。否则,如果您可以移动到可以使用它的主机,例如,所有与图像相关的代码(包括调整大小和编辑)都可以与Hostinger一起使用。

答案 2 :(得分:0)

即使线程已经死了,我也会发布此解决方案供以后搜索。今天我再次编辑代码并尝试了不同的方法。它类似于我之前的代码,但是我使用了file_get_contents()函数而不是require_once()/ require函数。

这是img.php的整体结果/代码:

<?php
#   FILE USED TO LOAD IMAGES.
if(isset($_GET['type'],$_GET['f'])){
    #   ATTEMPT TO LOCATE FILE
    $dir=array();
        $dir['path']='src/'.$_GET['type'].'/';
        $dir['files']=scandir($dir['path']);
    foreach($dir['files'] as$key=>$val){
        $fNameArr=explode('.',$val);
        if($fNameArr[0]==$_GET['f'] && $_GET['type']==pathinfo($dir['path'].$val,PATHINFO_EXTENSION)){
            #   FILE FOUND. SEND RIGHT HEADER AND INCLUDE FILE CONTENTS
            switch(pathinfo($dir['path'].$val,PATHINFO_EXTENSION)){
                case('png'):
                    header('Content-type:image/png', true);
                    break;
                case('jpg'):
                    header('Content-type:image/jpg', true);
                    break;
                case('gif'):
                    header('Content-type:image/gif', true);
                    break;
                default:
                    die('ERROR: invalid file type!');
                    break;
            }
            echo file_get_contents($dir['path'].$val);
        }
    }
}else{
    #   SELF EXPLANATORY ERROR
    die('ERROR: dependencies missing!');
}
?>