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