PHP:将图片存储在文件目录中,db中的图像名称和检索图像

时间:2012-07-24 01:59:12

标签: php

经过研究,我发现建议将图像名称保存在数据库中,将实际图像保存在文件目录中。其中两个原因是它更安全,图片加载速度更快。但是我没有真正理解这个程序,因为每次用firebug工具检索图片时,我都可以找到文件目录中的图片路径,这可能导致潜在的破坏。

我是否正确执行此操作,或者不假设显示图像的完整文件目录路径?

用于将图像保存到数据库中的PHP

$images = retrieve_images();
    insert_images_into_database($images);

    function retrieve_images()
    {        
        $images = explode(',', $_GET['i']);

        return $images;
    }

    function insert_images_into_database($images)
    {
        if(!$images) //There were no images to return
            return false;        

       $pdo = get_database_connection();

        foreach($images as $image)
        {

            $path = Configuration::getUploadUrlPath('medium', 'target');
            $sql = "INSERT INTO `urlImage` (`image_name`) VALUES ( ? )";

            $prepared = $pdo->prepare($sql);
            $prepared->execute(array($image));
            echo ('<div><img src="'. $path . $image . '" /></div>');
        }
    }

3 个答案:

答案 0 :(得分:1)

您可以使用.htaccess保护您的图片。

见这里:

http://michael.theirwinfamily.net/articles/csshtml/protecting-images-using-php-and-htaccess

答案 1 :(得分:1)

通过在数据库中存储图像来实现您最初打算做的事情的一种方法仍然是通过PHP脚本继续提供图像,因此:

  1. 让您的用户不知道图像的实际路径。
  2. 您可以而且应该拥有存储在DocumentRoot之外的图片,以便网络服务器无法提供这些图片。
  3. 通过readfile(),您可以通过以下方式实现这一目标:

    <?php
    // image.php
    
    // Translating file_id to image path and filename
    $path = getPathFromFileID($_GET['file_id']);
    $image = getImageNameFromFileID($_GET['file_id']);
    
    // Actual full path to the image file
    // Hopefully outside of DocumentRoot
    $file = $path.$image;
    
    if (userHasPermission()) {
        readfile($file);
    }
    else {
        // Better if you are actually outputting an image instead of echoing text
        // So that the MIME type remains compatible
        echo "You do not have the permission to load the image";
    }
    
    exit;
    

    然后,您可以使用标准HTML提供图像:

    <img src="image.php?file_id=XXXXX"> 
    

答案 2 :(得分:0)

我还在开发一个项目,该项目将数据库的url路径(Amazon RDS)和Amazon S3中云托管文件系统中的实际图像存储起来。

这样做的决定主要是关注<强>价格,可扩展性和易于实施。

更便宜:首先,与数据库(Amazon EC2 / RDS)相比,将数据存储在文件系统(Amazon S3)中更便宜。

可扩展性由于未来图像存储库可能会变得非常大,您可能还需要确保具有足够的服务能力。在这一点上,与数据库相比,扩展文件系统更容易。事实上,如果您使用云存储(如Amazon S3),您甚至不必担心亚马逊为您管理的空间不足!你需要为你使用的东西买单。

易于实施:在实施方面,将图像存储在文件系统中要容易得多。如果您直接从数据库提供图像,则可能需要实现其他逻辑以将blob文件转换为html src blob字符串以提供图像。从它的外观来看,这实际上可能会占用相当大的处理能力,这可能会降低Web服务器的速度。

另一方面,如果你要使用文件系统,你只需要将图像的url路径从数据库放到图像的src属性中,然后全部完成!

安全性:至于图像的安全性,我已将图像名称更改为与随机字符串连接的时间戳,这样一来,如果有人在不知道文件的情况下浏览图片,就会很难名。

即。 1342772480UexbblEY7Xj3Q4VtZ.png

希望这有帮助!

注意:如果您发现错误,请编辑我的帖子!这只是我的意见,欢迎大家编辑!