Php 使用readfile()或file\u get\u contents()从相对文件夹检索图像文件不起作用

Php 使用readfile()或file\u get\u contents()从相对文件夹检索图像文件不起作用,php,file-get-contents,readfile,file-exists,public-html,Php,File Get Contents,Readfile,File Exists,Public Html,我的根文件夹是public\u html。在public\u html之外,我有一个名为images的文件夹。 为了从这个文件夹中检索图像,我在数据库中查询存储在public\u htmlfolder->formsfolder->check\u images.php 我的数据库输出是: $output['filetype'] -> jpg $output['name'] -> 1 变量$file是相对路径+文件名+文件类型,使'../../images/1.jpg' 现在由于某些原

我的根文件夹是
public\u html
。在
public\u html
之外,我有一个名为
images
的文件夹。 为了从这个文件夹中检索图像,我在数据库中查询存储在
public\u html
folder->
forms
folder->
check\u images.php

我的数据库输出是:

$output['filetype'] -> jpg
$output['name'] -> 1
变量
$file
是相对路径+文件名+文件类型,使
'../../images/1.jpg'

现在由于某些原因,获取图像不起作用,但是
file\u exists()
工作正常

标题为:

header('Content-type: image/jpeg');
我做错了什么?为什么
readfile()
file\u get\u contents()
file\u exists()文件夹完全相同时,它们不能正常工作呢

整个代码可在此处找到:

当前显示的是空图像/或链接到的断开图像

更新

  • 首先,我检查URL:
  • 然后我运行图像代码:

  • 发生的情况很可能是除了图像之外还有其他输出,从而弄乱了图像二进制数据。查看页面的源代码,注意
    前的空格(您应该省略,因为它不是必需的)

    为了进一步帮助下载大型文件,我建议您使用XSendFile来处理繁重的工作

    • 对于Apache:
    • 对于NGINX:
    更新:

    $file_name = (int)$routes[2];
    $file = '../images/'.$file_name;
    
    $sql = "SELECT i.image_filetype as filetype, i.image_type as type, i.image_key "
            . "FROM images i "
            . "WHERE i.image_deleted IS NULL "
            . "AND i.image_id = :filename LIMIT 1";
    
    $results = $db_connect->prepare($sql);
    $results->bindParam(':filename', $file_name, PDO::PARAM_INT);
    $results->execute();
    $db_image = $results->fetchAll(PDO::FETCH_ASSOC);
    foreach($db_image as $output){
        // PROFILE PICTURE
        if($output['type'] === '1'){
            $path = $file.'.'.$output['filetype'];
            if(file_exists($path)){
                header('Content-type: image/jpeg');
                echo file_get_contents($path);
                exit;
            }else{$error_code = 4;}
        }
    }
    die('1');
    
    总之,它不起作用的最有可能的原因是从gzhandler开始的ob_,简单地删除它没有任何作用,这可能是因为电子标签和浏览器仍然显示缓存内容。

    • 你犯了一些小错误
    • 标题('Content-type:image/jpeg')应位于图像内容之前
    • 请检查文件夹设置,将其设置为
      。/
      。/../
    因此,您的是php代码:

    $file_name = (int)$routes[2];
    $file = '../images/'.$file_name;
    
    $sql = "SELECT i.image_filetype as filetype, i.image_type as type, i.image_key "
            . "FROM images i "
            . "WHERE i.image_deleted IS NULL "
            . "AND i.image_id = :filename LIMIT 1";
    
    $results = $db_connect->prepare($sql);
    $results->bindParam(':filename', $file_name, PDO::PARAM_INT);
    $results->execute();
    $db_image = $results->fetchAll(PDO::FETCH_ASSOC);
    foreach($db_image as $output){
        // PROFILE PICTURE
        if($output['type'] === '1'){
            $path = $file.'.'.$output['filetype'];
            if(file_exists($path)){
                header('Content-type: image/jpeg');
                echo file_get_contents($path);
                exit;
            }else{$error_code = 4;}
        }
    }
    die('1');
    
    更新代码

    不确定你做错了什么,但下面的代码对我来说很有用。所以请提供结果细节。 父文件夹中的我的图像文件id
    godaddy2.jpg

    <?php
    // ROUTES[2] IS = IMAGE_ID + UNIQID
    // EXAMPLE: 23
    //$file_name = (int)$routes[2];
    
    $file_name = 'godaddy2';
    
    //$file = '/home/husliste/images/'.$file_name;
    
    $file = '../images/'.$file_name;
    //
    //$sql = "SELECT i.image_filetype as filetype, i.image_type as type, i.image_key "
    //        . "FROM images i "
    //        . "WHERE i.image_deleted IS NULL "
    //        . "AND i.image_id = :filename LIMIT 1";
    //$results = $db_connect->prepare($sql);
    //$results->bindParam(':filename', $file_name, PDO::PARAM_INT);
    //$results->execute();
    //$db_image = $results->fetchAll(PDO::FETCH_ASSOC);
    $db_image[] = [
        'filetype' =>'jpg',
        'type' =>'1',
    ];
    
    function checkPlanAccess($a){
        return true;
    }
    foreach($db_image as $output){
        if($output['type']){
            // CREATE HEADER
            switch($output['filetype']){
                case "gif": $ctype="image/gif"; break;
                case "png": $ctype="image/png"; break;
                case "jpeg":
                case "jpg": $ctype="image/jpeg";break;
                default:
            }
            header('Content-type: '.$ctype);
            // CREATE FILE PATH
            $file_path = $file.'.'.$output['filetype'];
            // =========================================== //
            // PLAN
            if($output['type'] === '1'){
                if(checkPlanAccess($output['image_key'])){
                    if(file_exists($file_path)){
                        echo file_get_contents($file_path);
                    }else{$error_code = 4;}
                }else{$error_code = 4;}
            }
            // PROFILE PICTURE
            elseif($output['type'] === '2' && $check_session){
                if(file_exists($file_path)){
                    $image = file_get_contents($file_path);
                    echo $image;
                }else{$error_code = 4;}
            }
            // COMPANY LOGO
            elseif($output['type'] === '3' && $check_session){
                if(file_exists($file_path)){
                    echo file_get_contents($file_path);
                }else{$error_code = 4;}
            }
            // CUSTOMER LOGO
            elseif($output['type'] === '4'){
                if(checkCustomerAccess($output['image_key'])){
                    if(file_exists($file_path)){
                        echo file_get_contents($file_path);
                    }else{$error_code = 4;}
                }else{$error_code = 4;}
            }
            // CUSTOMER PROJECT IMAGES
            elseif($output['type'] === '5'){
                if(checkCustomerProjectAccess($output['image_key'])){
                    if(file_exists($file_path)){
                        echo file_get_contents($file_path);
                    }else{$error_code = 4;}
                }else{$error_code = 4;}
            }
            // SUPPLIER LOGO
            elseif($output['type'] === '6'){
                if(checkSupplierAccess($output['image_key'])){
                    if(file_exists($file_path)){
                        echo file_get_contents($file_path);
                    }else{$error_code = 4;}
                }else{$error_code = 4;}
            }else{
                $error_code = 4;
            }
        }else{
            $error_code = 4;
        }
    }
    die('1');
    ?>
    
    
    
    您可以显示更多您尝试使用的代码吗?@Aborted Posted:)忽略其中的
    错误。它不在实际应用程序的
    标题中('Content-type:image/jpeg)。。。它缺少结束单报价。可能是您出错了?@Aborted请参见上面的评论如果您
    echo
    输出文件内容,而没有JPEG头,它是否显示了任何内容?我已经检查了空白。那里什么也没有。每当我删除
    图像标题时,
    页面上就会输出一堆随机字母。。。使用
    图像标题
    我什么也得不到。你能粘贴完整的代码,包括php标记,并粘贴完整的输出,包括标题。我添加了粘贴框,请参阅更新。这是完整的代码。输出只是来自浏览器的标准断开图像。没有显示任何代码。查看源代码并粘贴到它--在刚添加到粘贴到文件中的一个文件中,您使用了ob_start()和gz_处理程序,您是否只是为了测试而尝试删除这些代码?我猜是电子标签和/或缓存策略迫使您的浏览器显示旧内容。gzhandler的ob_start可能就是原因。我已经测试了这两个,仍然有相同的输出。有关最新测试,请参阅更新的代码。但是,当我添加错误的文件路径时,我会得到输出
    1