使用 readfile() 或 file_get_contents() 从相关文件夹中检索图像文件不起作用
Retrieving image file from relative folder using readfile() or file_get_contents() not working
我的根文件夹是 public_html
。在 public_html
之外,我有一个名为 images
的文件夹。
为了让我从此文件夹中检索图像,我在数据库中查询存储在 public_html
文件夹 -> forms
文件夹 -> check_images.php
[= 中的文件中的正确图像名称和扩展名28=]
我的数据库输出是:
$output['filetype'] -> jpg
$output['name'] -> 1
变量$file
是相对路径+文件名+文件类型,所以'../../images/1.jpg'
.
现在由于某种原因无法获取图像,但是 file_exists()
工作正常。
header是:
header('Content-type: image/jpeg');
我做错了什么?以及为什么 readfile()
或 file_get_contents()
在与 file_exists()
完全相同的文件夹时不能正常工作
完整代码可以在这里找到:
http://pastebin.com/MhkAfY4s
当前显示的是空图像/或链接时损坏的图像。
更新
- 首先我检查了URL:http://pastebin.com/Fz36GmVD
- 那我运行图片代码:http://pastebin.com/fZSRuJ4r
发生的事情很可能是除了图像之外还有其他输出,从而弄乱了图像二进制数据。查看页面的源代码,注意 <?php
之前的任何空格以及结尾 ?>
one 之后的任何空格(您应该省略,因为不需要)
为了进一步帮助下载大文件,我建议您使用 XSendFile 来为您处理繁重的工作。
- 对于 Apache:https://tn123.org/mod_xsendfile/
- 对于 NGINX:https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/
更新:
总而言之,它不起作用的最可能原因是 ob_start 与 gzhandler,简单地删除它并没有做任何事情,这可能是因为 E-Tag 和浏览器仍然显示缓存内容.
- 你犯了一些小错误
- header('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
在父 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');
?>
我的根文件夹是 public_html
。在 public_html
之外,我有一个名为 images
的文件夹。
为了让我从此文件夹中检索图像,我在数据库中查询存储在 public_html
文件夹 -> forms
文件夹 -> check_images.php
[= 中的文件中的正确图像名称和扩展名28=]
我的数据库输出是:
$output['filetype'] -> jpg
$output['name'] -> 1
变量$file
是相对路径+文件名+文件类型,所以'../../images/1.jpg'
.
现在由于某种原因无法获取图像,但是 file_exists()
工作正常。
header是:
header('Content-type: image/jpeg');
我做错了什么?以及为什么 readfile()
或 file_get_contents()
在与 file_exists()
完整代码可以在这里找到: http://pastebin.com/MhkAfY4s
当前显示的是空图像/或链接时损坏的图像。
更新
- 首先我检查了URL:http://pastebin.com/Fz36GmVD
- 那我运行图片代码:http://pastebin.com/fZSRuJ4r
发生的事情很可能是除了图像之外还有其他输出,从而弄乱了图像二进制数据。查看页面的源代码,注意 <?php
之前的任何空格以及结尾 ?>
one 之后的任何空格(您应该省略,因为不需要)
为了进一步帮助下载大文件,我建议您使用 XSendFile 来为您处理繁重的工作。
- 对于 Apache:https://tn123.org/mod_xsendfile/
- 对于 NGINX:https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/
更新:
总而言之,它不起作用的最可能原因是 ob_start 与 gzhandler,简单地删除它并没有做任何事情,这可能是因为 E-Tag 和浏览器仍然显示缓存内容.
- 你犯了一些小错误
- header('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
在父 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');
?>