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

PHP:将图片存储在文件目录中,将图像名称存储在db中,并检索图像,php,Php,经过研究,我发现更建议将图像名称保存在数据库中,将实际图像保存在文件目录中。其中两个原因是它更安全,图片加载速度更快。但我并不真正理解执行此过程的意义,因为每次我使用firebug工具检索图片时,我都可以在文件目录中找到可能导致潜在漏洞的图片路径 我这样做是否正确,或者它不应该显示图像的完整文件目录路径 用于将图像保存到数据库中的PHP $images = retrieve_images(); insert_images_into_database($images); func

经过研究,我发现更建议将图像名称保存在数据库中,将实际图像保存在文件目录中。其中两个原因是它更安全,图片加载速度更快。但我并不真正理解执行此过程的意义,因为每次我使用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>');
        }
    }
$images=retrieve_images();
将图片插入图片数据库($images);
函数retrieve_images()
{        
$images=explode(',',$_GET['i']);
返回$images;
}
函数insert_images_到_数据库($images)
{
if(!$images)//没有要返回的图像
返回false;
$pdo=获取_数据库_连接();
foreach($images作为$image)
{
$path=Configuration::getUploadUrlPath('medium','target');
$sql=“插入到`urlmimage`(`image_name`)值(?);
$prepared=$pdo->prepare($sql);
$prepared->execute(数组($image));
回声(“”);
}
}

您可以使用.htaccess保护您的图像

请看这里:


通过在数据库中存储图像来实现最初目的的一种方法仍然是通过PHP脚本继续为图像提供服务,因此:

  • 阻止用户了解图像的实际路径
  • 您可以而且应该将图像存储在
    DocumentRoot
    之外,这样web服务器就无法为它们提供服务
  • 以下是一种实现这一目标的方法:


    我还在从事一个项目,该项目将图像的url路径存储在数据库(Amazon RDS)上,并将实际图像存储在Amazon S3的云管理文件系统中

    这样做的决定主要是出于对价格、可扩展性和易实施性的考虑。

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

    可伸缩性:由于图像存储库在未来可能会变得相当庞大,您可能还需要确保您有足够的容量为它们提供服务。在这一点上,与数据库相比,文件系统更容易扩展。事实上,如果您正在使用云存储(如Amazon S3),您甚至不必担心没有足够的空间,因为它是由Amazon为您管理的!你只需要为你使用的东西付钱

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

    另一方面,如果要使用文件系统,则只需将图像的url路径从数据库放到图像的src属性,然后完成所有操作

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

    即1342772480UexbblEY7Xj3Q4VtZ.png

    希望这有帮助


    注意:如果你在这里发现任何错误,请编辑我的帖子!这只是我的观点,欢迎大家编辑

    您是否希望非目标方无法检索图像?使用图像名称而不是将图像存储在数据库中的原因是,不建议将图像存储在数据库表中,因为它会占用大量空间。
    <?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;
    
    <img src="image.php?file_id=XXXXX">