правильный способ загрузки изображения в базу данных - PullRequest
0 голосов
/ 26 июня 2009

Я знаю, что некоторые из вас скажут, что это не правильный путь, но я в сжатые сроки, чтобы завершить приложение, и на данный момент я не могу вернуться и изменить код для хранения изображений в каталоге. *

теперь, когда это очищено

Вопрос, который у меня возник, заключается в том, что я вставил изображение в базу данных, набрав его.

(не обращайте внимания на вызов безопасности класса, все, что он делает, - это несколько проверок на достоверность данных)

$filename = $security->secure($_FILES['imgschool']['name']);
$tmpname = $security->secure($_FILES['imgschool']['tmp_name']);
$imgsize = $security->secure($_FILES['imgschool']['size']);
$imgtype = $security->secure($_FILES['imgschool']['type']);
$school = $security->secure($_POST['school']);


//begin upload
if($imgsize > 0) {
$handle = fopen($tmpname, "r");
$content = fread($handle, filesize($tmpname));
$content = addslashes($content);

//code to add all this to database
}

переменная $ content является изображением, и все, что она получает, это аддлэш. Я помню, как кто-то однажды упомянул, что это делается с помощью base64, но я едва могу вспомнить, как это было написано.

так я называю изображение из базы данных

кроме всех запросов и еще много чего это основная часть, которая вызывает изображение

header("Content-length: ".$imgsize);
header("Content-type: ".$imgtype);
header("Content-Disposition: attachment; filename=".$imgname);
print $row['img'];

У меня проблема в том, что вместо показа изображения. URL только показывает, так что в этом случае я вижу только это

http://localhost/admin/school-catalog.php?page=gallery&id=4

при открытии страницы для просмотра изображения с правильными параметрами, установленными в URL.


для тех, кто хотел увидеть запрос, который делается для сохранения изображения и т. Д. я скопировал весь раздел

//save image to db
if(isset($_POST['btnupload'])) {

$filename = $security->secure($_FILES['imgschool']['name']);
$tmpname = $security->secure($_FILES['imgschool']['tmp_name']);
$imgsize = $security->secure($_FILES['imgschool']['size']);
$imgtype = $security->secure($_FILES['imgschool']['type']);
$school = $security->secure($_POST['school']);


//begin upload
if($imgsize > 0) {
$handle = fopen($tmpname, "r");
$content = fread($handle, filesize($tmpname));
$content = base64_encode($content);
}

$save = mysql_query("insert into tbl_schoolgallery(id,hash,img,imgtype,imgsize) values(null,'$school','$content','$imgtype','$imgsize')") or die(mysql_error());
header("Location: school-catalog.php?page=school_gallery");

}


//call image from db
$query = mysql_query("select * from $tbl where id = '$id'") or die(mysql_error());
while($row = mysql_fetch_assoc($query)) {

$imgtypeget = explode("/", $row['imgtype']);

$imgname = "img.".$imgtypeget[1];
$imgtype = $row['imgtype'];
$imgsize = $row['imgsize'];

header("Content-length: ".$imgsize);
header("Content-type: ".$imgtype);
print base64_decode($row['img']);

print $row['img'];
}

1 Ответ

7 голосов
/ 26 июня 2009

Использование addslashes крайне некорректно. В зависимости от того, является ли ваш столбец полем TEXT или полем BLOB, вы должны использовать Base64 или mysql_real_escape_string.

Использование Base64 не так сложно; Вы также можете использовать этот способ. Просто замените addslashes на base64_encode и отобразите изображение на base64_decode.

Есть немного более простой способ написать все это, в этом отношении:

// begin upload
if ($imgsize > 0)
{
  $content = file_get_content($tmpname);
  $content = base64_encode($content);
}

И тогда для вывода вам действительно нужно всего лишь

header("Content-type: ".$imgtype);
echo base64_decode($img);

Если столбец является BLOB, вы можете напрямую использовать mysql_real_escape_string:

// begin upload
if ($imgsize > 0)
{
  $content = file_get_content($tmpname);
  $content = mysql_real_escape_string($content);
}

А потом:

header("Content-type: ".$imgtype);
echo $img;

Хотя, судя по вашим текущим симптомам, я предполагаю, что у вас также есть ошибка, связанная с тем, как ваше изображение хранится и вызывается из базы данных, и мне нужно было бы увидеть ту часть кода, где вы делаете запросы вставить и прочитать из базы данных, прежде чем я смогу помочь вам исправить эту часть.


Ваш текущий код в основном в порядке. Несколько вопросов:

print base64_decode($row['img']);

print $row['img'];

Вы, вероятно, хотели избавиться от второго ряда. Кроме того, вы должны использовать echo вместо print; каждый использует его, иногда он может быть немного быстрее, и print на самом деле не имеет никакой выгоды, кроме возврата значения:

echo base64_decode($row['img']);

$security->secure(), похоже, является своего рода функцией очистки. Просто используйте mysql_real_escape_string() - это тот, который вы должны использовать. Кроме $imgsize; возможно, вы захотите использовать intval() для этого, поскольку знаете, что оно должно быть целым числом.

Также здесь:

$query = mysql_query("select * from $tbl where id = '$id'") or die(mysql_error());

Вы называете таблицу tbl_schoolgallery на несколько строк выше. Я предполагаю $tbl == 'tbl_schoolgallery', но для согласованности вы должны использовать $tbl в обоих местах или tbl_schoolgallery в обоих местах.

Кроме того, замените это while на if - ваш код в любом случае вызовет проблемы, если он когда-либо будет повторяться более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...