PHP Mysql - 图像无法在浏览器上显示(损坏的图像)

时间:2015-04-06 16:17:10

标签: php mysql image path brokenimage

我正在制作一个上传应用程序,我有一个脚本,一旦上传图像,它们会被调整大小但原始尺寸会被存储以供日后使用。 index.php应该应该在屏幕上显示图像。

我已经在数据库中存储了图像路径而不是blob,并使用了'路径'变量以在浏览器上显示它。

搜索有效但图像没有显示,我无法找到原因。

我是php / mysql的新手,所以对于为什么我的图像没有显示出来感谢任何帮助。

upload.php的

<?php

require_once 'includes/config.inc.php';
require_once 'includes/functions.php';

// Add the heading to output
$output = '<h1>Gallery</h1>';

// Echo the gathered output
echo $output;

// Include the HTML header
include_once 'includes/head.html';

// Check if the form has been submitted...
if (isset($_POST['fileupload']) 
    && isset($_POST['title']) && isset($_POST['description'])) {

    $title = $_POST['title'];
    $description = $_POST['description'];

    if (is_uploaded_file($_FILES['userfile']['tmp_name'] )) {       
        $updir = dirname(__FILE__).'/uploads/';
        //$upfilename = $_FILES['userfile']['name'];
        $ext=end(explode(".", $_FILES['userfile']['name']));//gets extension
        $newname = $updir.$title;
        $tmpname = $_FILES['userfile']['tmp_name'];
        $newimage = $newname.'.'.$ext;
        $path = $newimage;

        //if file is an image, upload it
        if($_FILES['userfile']['type'] ==  'image/jpeg'){
    if (move_uploaded_file($tmpname, $newimage)) {
        //print if file was uploaded        
            //echo 'File successfully uploaded';
            list($width, $height) = getimagesize($newimage);
            //Add values to the DB
            $sql = "INSERT INTO Images VALUES(NULL, '$title', '$description', '$width', '$height', '$path')";
            $result = mysqli_query($link, $sql);
            if(!$result) die ("Database access failed: " . $link->error);
            $w = $width;
            $h = $height;
            resize($newimage, $width, $height);
            }
            } else {
        //print if file failed
            echo 'File upload failed';
            }
            }
            //echo debug();
            }
// Include the HTML footer
?>      

index.php(sql脚本在这里)

<?php
require_once 'includes/config.inc.php';
require_once 'includes/functions.php';

if (!isset($_GET['page'])) {
 $id = 'home'; // display home page
} else {
 $id = $_GET['page']; // else requested page
}

switch ($id) {
    case 'home' :
        include 'uploads.php';
        break;
    default :
        include 'views/404.php';
}

$sql = 'SELECT * FROM Images';
$result = mysqli_query($link, $sql);
if(!$result){
die(mysqli_error($link));
}else{
while($row = mysqli_fetch_array($result)){
    echo '<div><a href= "#">
            <img src="'.$row['path'].'" width=150 height=150 alt="'.$row['title'].'" /></a></div>';
}
mysqli_free_result($result);
}
/*
Alternative way of showing the right images
$images = glob('uploads/*.jpg');
for($i = 0; $i < count($images); $i++){
    list($w,$h) = getimagesize($images[$i]);
    $allimages = $images[$i];

echo  '<div><a href="'.$allimages.'">
 <img src="'.$allimages.'" width="'.$w.'" height="'.$h.'" alt="" /></a>
            </div><br/>';
    }*/
    include_once 'includes/footer.html';
?>

2 个答案:

答案 0 :(得分:0)

问题是您使用dirname(__FILE__)作为图像路径的起点,并将完整路径存储在数据库中。

根据手册dirname

  

返回父目录的路径。

__FILE__

  

解决了符号链接的文件的完整路径和文件名。

因此,您使用服务器本地文件系统上的绝对路径存储图像。

但是,该绝对路径并不是相对于Web服务器根目录的绝对路径,因此浏览器将无法找到图像。

解决方案是在移动上传的图像时使用绝对路径,但存储相对于Web服务器根目录的绝对路径。

在您的情况下,您可以使用/uploads/路径,但这取决于确切的文件结构:

...
// no dirname here
$updir = '/uploads/';

//$upfilename = $_FILES['userfile']['name'];
$ext=end(explode(".", $_FILES['userfile']['name']));//gets extension
$newname = $updir.$title;
$tmpname = $_FILES['userfile']['tmp_name'];
$newimage = $newname.'.'.$ext;
$path = $newimage;

//if file is an image, upload it
if($_FILES['userfile']['type'] ==  'image/jpeg'){

    // only use dirname() here
    if (move_uploaded_file($tmpname, dirname(__FILE__) . $newimage)) {
        ...

答案 1 :(得分:0)

您必须将服务器的域添加到img标记的src属性中,这样它才会成为用户查看图像的绝对路径:

 echo '<div><a href= "#">
            <img src="'$_SERVER['HTTP_HOST'].$row['path'].'" width=150 height=150 alt="'.$row['title'].'" /></a></div>';