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');
更新代码:
不确定你做错了什么,但下面的代码对我来说很有用。所以请提供结果细节。
父文件夹中的我的图像文件idgodaddy2.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