2012-07-24 2 views
2

После исследования я обнаружил, что рекомендуется сохранять имя изображения в базе данных и фактическое изображение в каталоге файлов. Две из немногих причин в том, что это более безопасно, и фотографии загружаются намного быстрее. Но я действительно не понимаю, как это сделать, потому что каждый раз, когда я извлекаю снимки с помощью инструмента firebug, я могу узнать путь изображения в каталоге файлов, который может привести к потенциальному прорыву.PHP: Сохранение изображения в каталоге файлов, имя изображения в db и извлечение изображения

Я делаю это правильно или не должен показывать полный путь к файловому каталогу изображения?

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>'); 
     } 
    } 
+1

Вы хотите, чтобы ваши изображения были недоступны для незапланированных вечеринок? – uzyn

+0

@uzyn Да, я. – techAddict82

+0

Причина использования имени изображения вместо хранения изображения в базе данных заключается в том, что не рекомендуется хранить изображения в таблице базы данных, так как занимает много места. – Micheal

ответ

1

Один из способов добиться того, что вы изначально намеревались сделать путем сохранения изображений в базе данных по-прежнему продолжают служить изображение с помощью PHP скрипт, таким образом:

  1. Защитите своих пользователей от знания фактического пути изображения.
  2. Вы можете и должны иметь изображения, хранящиеся за пределами вашего DocumentRoot, чтобы они не могли обслуживаться веб-сервером.

Вот один из способов вы можете добиться того, что через 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"> 
0

Я также работаю над проектом, который сохраняет URL-адрес изображений в базе данных (Amazon RDS) и фактические изображения в управляемой облаками файловой системе в Amazon S3.

Решение сделать это в первую очередь связано с ценой, масштабируемостью и простотой реализации .

Дешевле: Во-первых, это дешевле, хранить данные в файловой системе (Amazon S3) по сравнению с базой данных (Amazon EC2/RDS).

Масштабируемость: И поскольку в будущем репозиторий изображений может расти довольно большой, вам также может потребоваться обеспечить достаточную емкость для их обслуживания. С этой точки зрения проще масштабировать файловую систему по сравнению с базой данных. Фактически, если вы используете облачное хранилище (например, Amazon S3), вам даже не нужно беспокоиться о том, что у вас недостаточно пространства, как это было для вас Amazon! вам просто нужно заплатить за то, что вы используете.

Простота реализации: С точки зрения реализации, хранение изображений в файловой системе намного проще. Если вы должны были обслуживать изображения непосредственно из баз данных, вам, вероятно, потребуется реализовать дополнительную логику для преобразования блочных файлов в строки html src blob для обслуживания изображений. И, судя по всему, на самом деле это может привести к довольно значительной вычислительной мощности, что может замедлить работу вашего веб-сервера.

С другой стороны, если вы хотите использовать файловую систему, все, что вам потребуется, это указать путь URL-адреса изображения из базы данных в атрибут src изображения и все это сделать!

Безопасность: Что касается безопасности изображений, я изменил имя изображений на метку время сцепленного со случайной строкой так, что она окажется очень трудной для кого-то, чтобы получить картины, не зная имя файла.

ie. 1342772480UexbblEY7Xj3Q4VtZ.png

Надеюсь, это поможет!

NB: Пожалуйста, отредактируйте мое сообщение, если вы найдете здесь что-то не так! это только мое мнение, и все могут редактировать!

Смежные вопросы