【问题标题】:Displaying pictures from path in PHP from MySQL从 MySQL 的 PHP 中显示路径中的图片
【发布时间】:2012-09-24 02:56:49
【问题描述】:

我正处于开发出价系统的早期阶段,用户可以在该系统中插入他们想要出售的商品。这是从临时路径复制图像并将图像的路径存储到另一个文件夹的脚本。

    define ("MAX_SIZE","10000");

    //This function reads the extension of the file. It is used to determine if the file is an image by checking the extension.
    function getExtension($str) {
        $i = strrpos($str,".");
        if (!$i) {
            return "";
        }
        $l = strlen($str) - $i;
        $ext = substr($str,$i+1,$l);
        return $ext;
    };

    //This variable is used as a flag. The value is initialized with 0 (meaning no error found) and it will be changed to 1 if an errro occures. If the error occures the file will not be uploaded.
    $errors = 0;

    //Checks if the form has been submitted
    if (isset($_POST['Submit']))
    {
        //Reads the name of the file the user submitted for uploading
        $image=$_FILES['image']['name'];

        //If it is not empty
        if ($image)
        {
            //Get the original name of the file from the clients machine
            $filename = stripslashes($_FILES['image']['name']);

            //Get the extension of the file in a lower case format
            $extension = getExtension($filename);
            $extension = strtolower($extension);

            //If it is not a known extension, we will suppose it is an error and will not upload the file, otherwize we will do more tests
            if (($extension != "jpg") &&
                ($extension != "jpeg") &&
                ($extension != "png") &&
                ($extension != "gif"))
            {
                //Print error message
                echo '<h1>Unknown extension!</h1>';
                $errors=1;
            }
        else
        {
            //Get the size of the image in bytes
            //$_FILES['image']['tmp_name'] is the temporary filename of the file in which the uploaded file was stored on the server
            $size=filesize($_FILES['image']['tmp_name']);

            //Compare the size with the maxim size we defined and print error if bigger
            if ($size > MAX_SIZE*111111111111024)
            {
                echo '<h1>You have exceeded the size limit!</h1>';
                $errors=1;
            }

            //We will give an unique name, for example the time in Unix time format
            $image_name=time().'.'.$extension;

            //The new name will be containing the full path where will be stored (images folder).
            $imagepath='C:\\xampp\\htdocs\\biddingsystem\\Images\\' . $image_name;

            //We verify if the image has been uploaded, and print an error instead
            $copied = copy($_FILES['image']['tmp_name'], $imagepath);
            if (!$copied)
            {
                echo '<h1>Picture upload failed!</h1>';
                $errors=1;
            }
        }
    }
}

//If no errors registred, print the success message
if(isset($_POST['Submit']) && !$errors && isset($_POST['image']))
{
    echo "<h1>Picture Uploaded Successfully! Try again!</h1>";
}

然后,我使用下面的脚本将图像路径和其他数据插入到 MySQL 数据库中,并尝试使用表格将它们显示给用户。其他数据正常,但对于图像显示(图像路径),仅显示图像的路径,而不显示图像本身。

mysql_query("INSERT INTO items
    (username, item, price, description, start_date, start_time, imagepath)
    VALUES    ('$username', '$_POST[item]', '$_POST[price]', '$_POST[description]','$_POST[start_date]', '$_POST[start_time]', '$imagepath') ")
    or die ("Error - Couldn't add item");

    echo "Item added successfully";
    echo "<h1>You have added the following item:</h1>";
    $sql = "SELECT item, price, description, start_time, start_date, imagepath FROM items WHERE username = '$username' AND item='$_POST[item]'";
    $result = mysql_query($sql);

$row = mysql_fetch_assoc($result);
echo"<table border=2>

         <tr><td>Item</td>
             <td>Price</td><td>Description</td><td>Start time</td><td>Start date</td><td>Picture</td></tr>

         <tr><td> $row[item]</td>
              <td> $row[price]</td>
              <td> $row[description]</td>
             <td> $row[start_time]</td>
             <td> $row[start_date]</td>
             <td> $row[imagepath]</td>
         </tr>
     </table></br>";

我曾尝试使用&lt;img src="&lt;?php $imagepath ?&gt;"&gt; 显示图像,但无济于事。我什至尝试使用 BLOB 类型将实际图像本身存储在数据库中。然而,结果是一个充满奇怪字符的页面。我该如何解决这个问题?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您混淆了文件系统路径和网络URL。您必须只存储 /biddingsystem/Images/ 部分,甚至只存储名称并在显示时动态生成完整路径。

    另外请注意,您没有正确格式化数据,这会导致一些错误和安全漏洞。我在之前对 Stack Overflow 问题的回答中解释了格式化规则How to include a PHP variable inside a MySQL insert statement

    【讨论】:

    • 已将其更改为相对路径,并显示以下警告:警告:复制(/biddingsystem/Images/1320662886.jpg)[function.copy]:无法打开流:没有这样的文件或目录在第 87 行的 C:\xampp\htdocs\biddingsystem\auction.php 中
    • 顺便说一句,我已将该行更改为:$imageData='/biddingsystem/Images/'.$image_name;
    • $copyed = copy($_FILES['image']['tmp_name'], $imageData);
    • 您仍然应该使用文件系统路径进行文件系统操作,例如 copy()
    • 好了,这样路径名就成功存入mysql列了。在该列中,它显示为:/xampp/htdocs/biddingsystem/Images/1320667841.jpg。我相信现在路径是正确的,因为图像显示在该文件夹中。但是当我尝试使用“”输出图片时,仍然没有输出。
    【解决方案2】:

    如果您想使用第一个解决方案,从路径显示,请确保您指向可访问路径中的图像。从您列出的代码中,看起来 $imagepath 是一个 file:// 路径。在 Web 服务器上,您必须将其映射到相对 Web 路径。

    如果您决定使用 BLOB,最好的方法是制作一个单独的页面来提供图像。您的输出图像标签应指向该位置,您需要更改图像服务页面标题中的内容类型。

    【讨论】:

    • 永远不需要寻求第二个解决方案。
    • 谢谢,我想我会坚持第一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多