使用readfile()或file_get_contents()从相对文件夹中检索图像文件无效

时间:2016-06-28 13:09:37

标签: php file-get-contents readfile file-exists public-html

我的根文件夹是public_html。在public_html之外,我有一个名为images的文件夹。 为了让我从这个文件夹中检索图像,我在数据库中查询正确的图像名称&存储在public_html文件夹中的文件中的扩展名 - > forms文件夹 - > check_images.php

我的数据库输出是:

$output['filetype'] -> jpg
$output['name'] -> 1

变量$file是相对路径+文件名+文件类型,这使得'../../images/1.jpg'

现在由于某种原因,提取图像不起作用,但是file_exists()工作正常。

标题是:

header('Content-type: image/jpeg');

我做错了什么?为什么readfile()file_get_contents()file_exists()

完全相同的文件夹时不应该正常工作?

可在此处找到整个代码: http://pastebin.com/MhkAfY4s

当前显示的内容是链接到的空图像/或损坏的图像。

更新

  1. 首先,我查看网址:http://pastebin.com/Fz36GmVD
  2. 然后我运行图像代码:http://pastebin.com/fZSRuJ4r

2 个答案:

答案 0 :(得分:1)

正在发生的事情很可能是除了图像之外还有其他输出,从而弄乱了图像二进制数据。看一下页面的来源,注意<?php之前的任何空格以及结束?>之后的任何空格(你应该省略它,因为它不需要)

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

<强>更新

总而言之,最不可能的原因是it_start与gzhandler,只是删除它没有做任何事情,这可能是因为E-Tag和浏览器仍显示缓存内容。

答案 1 :(得分:0)

  • 你做了一些小错误
  • 标题('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');

更新代码

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

<?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');
?>