Поле MySQL и BLOB невозможно загружать/отображать изображения из PHP (но это работает вручную) / Binary/HEX DUMP?

Я схожу с ума из-за этой проблемы. Вот моя база данных:

Cod_Classification  int(11)
Cod_App         char(10)
ID_eventclass   char(5)
Descrizione char(35)
Active          char(1)
Logo_Eve    blob

Я использую эту форму для заполнения:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Prova di Upload</title>
</head>

<body>

<form action="UploadImage.php" method="post" enctype="multipart/form-data">
    <p>
    <label for="ID_evcls">Codice evento</label> <input  type="text" name="ID_evcls" maxlength="5" size="10"> <br>
    <label for="Desc">Descrizione</label> <input  type="text" name="Desc" maxlength="35" size="40"> <br>
    Logo da utilizzare: <input name="userfile" type="file" /><br>
    <input type="submit" value="Send File" />
    <p>
</form>

</body>
</html>

И это часть PHP:

<?php
$db_host = "localhost";
$db_user = "USERNAMEDB";
$db_database = "NAMEDATABASE";
$db_password = "*********";
$db_tabeventclassification = "adv_eventclassification";

$ID_ev = $_POST[ID_evcls];
$ID_ds = $_POST[Desc];
$ID_logo = $_FILES['userfile']['name'];
$ID_tmp = $_FILES['tmp_name'];

echo $ID_ev.' '.$ID_ds.' '.$ID_logo.' '.$ID_tmp.'<br><br>';
move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name']);
echo '<br><img src="'.$ID_logo.'"><br>';

$datimmagine = file_get_contents($ID_logo);
echo '<br><img src="data:image/jpeg;base64,'.base64_encode($datimmagine).'"><br>';

$connessione = mysql_connect($db_host,$db_user,$db_password);
echo "OK, database is connected<br><br>";

$query='INSERT INTO '.$db_tabeventclassification.' (`Cod_App`, `ID_eventclass`, `Descrizione`, `Active`, `Logo_Eve`) VALUES ("RCWORLDTLV","'.strtoupper($ID_ev).'","'.$ID_ds.'","1","'.addslashes(base64_encode($datimmagine)).'")';
$result = mysql_db_query("AdVisual_02_", $query ,$connessione); 

?>

Когда я запускаю html и загружаю изображение, я МОГУ ВИДЕТЬ СОВЕРШЕННО НА ЭКРАНЕ, и если я использую PhpMyAdmin, я вижу поле blob с данными. Но когда я ПОЛУЧАЮ данные из базы данных, у меня ВСЕГДА появляется неработающий результат изображения ссылки. Вот приложение, которое я создал для отображения данных:

<?php
$AdVisualV2MANAGER_ver='0.0030';

echo 'AdVisual V2 Backend Manager Versione '.$AdVisualV2MANAGER_ver.'<br>';
// echo 'Television ID: '.$Host_Cod_App.'<br>';

$db_host = "localhost";
$db_user = $db_prefix."AdVisualV02USR";
$db_database = $db_prefix."AdVisual_02_";
$db_password = "adv2pwpwpw";
$db_tabconfig = "adv_config";
$db_tabpreroll = "adv_preroll";
$db_tabimpressions = "adv_videoimpressions";
$db_tabevents = "adv_events";
$db_tabeventclassification = "adv_eventclassification";
mysql_connect($db_host,$db_user, $db_password);

echo "Connection to the Server opened; Database is ".$db_database." opening result is ".mysql_select_db($db_database)."<br>";
echo "Now listing events<br><br>";

$result = mysql_query("SELECT * FROM ".$db_database.".".$db_tabeventclassification." WHERE `Active` =1");
if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}

echo '<table width="750" border="1">
            <tr>
                <th width="100" align="center" valign="top"><b>EVENTO</b></th>
                <th width="300" align="center" valign="top"><b>DESCRIZIONE</b></th>
                <th width="50" align="center" valign="top"><b>LOAD</b></th>
                <th width="200" align="center" valign="top"><b>LOGO</b></th>
            </tr>';
$numerorighe = mysql_num_rows($result);
for ($i=0;$i<$numerorighe;$i++) {
    $riga = mysql_fetch_row($result);
    echo '<tr>';
    echo '<td align="left" valign="top">'.$riga[2].'</td>';
    echo '<td align="left" valign="top">'.$riga[3].'</td>';
    $button[i]='<input type="button" id="bt"'.$i.' onclick="LoadJpg('.$i.')" value="Load '.$i.'-->">';
    echo '<td align="center" valign="top">'.$button[i].'</td>';
    echo '<td align="center" valign="top"> <img src="data:image/jpeg;base64,'.base64_encode($riga[5]).'"></td>';
    echo '</tr>';
}

echo '</table>';

?>

<script>
function LoadJpg(scelta)
{
    document.write('<input type="file" name="datafile" accept="image/jpeg">');
}
</script>

Но если я вручную загружаю то же изображение в поле blob, используя phpmyadmin, оно работает отлично. Даже если я сбрасываю содержимое, всегда используя phpmyadmin, загружая файл .bin и переименовывая его в .jpg, он работает отлично.

Дело в том, что когда я загружаю изображение с помощью phpmyadmin, я вижу, что оно преобразует данные в шестнадцатеричный формат и генерирует такой оператор SQL:

UPDATE `AdVisual_02_`.`adv_eventclassification` SET `Logo_Eve` = 0xffd8ffe0001 ... 

0acf43a5a97a6089ffd9 WHERE `adv_eventclassification`.`Cod_Classification` = 61;

Что, черт возьми, я могу сделать? Где я не прав? Я схожу с ума по этому поводу уже 3 дня!!!!! Спасибо любой добрый человек постарается мне помочь чао


person Roberto Alfieri    schedule 18.03.2013    source источник


Ответы (3)


Проблема в том, как вы сохраняете файл в своей базе данных. Вы хотите отобразить встроенный HTML-код изображения, что подходит для очень маленьких изображений размером менее 1 КБ, не рекомендуется для больших файлов. В этом контексте использование base64_encode для вывода нормально, потому что вы не можете иметь двоичные данные в выходном документе text/html. Но тип данных MySQL blob создан специально для двоичных данных.

$query='INSERT INTO '.$db_tabeventclassification.' (`Cod_App`, `ID_eventclass`, `Descrizione`, `Active`, `Logo_Eve`) VALUES ("RCWORLDTLV","'.strtoupper($ID_ev).'","'.$ID_ds.'","1","'.mysql_real_escape_string( $datimmagine).'")';

Вот и все. В настоящее время вы просто сохраняете изображение как текст (base64), а затем снова конвертируете этот текст, используя алгоритм base64 для вывода.

Интересная статья для прочтения:

http://www.java-samples.com/showtutorial.php?tutorialid=930

person Michel Feldheim    schedule 18.03.2013
comment
Бинго!!!! Это была функция mysql_real_escape_string, которую я не добавлял!!!! СПАСИБО БОЛЬШОЕ вы спасли мне жизнь и жизнь моей семьи - person Roberto Alfieri; 19.03.2013

Попробуйте использовать .chunk_split(base64_encode($riga[5])). в соответствии с этот ответ на получение данных изображения BLOB из MySQL в PHP. Строка данных вашего изображения в кодировке Base64, возможно, слишком длинная и должна быть 'разбита на части', прежде чем вы отобразите его в своем документе, чтобы соответствовать RFC 2045:

qp-часть := qp-раздел ; Максимальная длина 76 символов

Казалось бы, это сортируется само по себе при копировании/вставке из другого редактора (или средства просмотра BLOB), но не сортируется автоматически с помощью echo при извлечении значения записи.

person TildalWave    schedule 18.03.2013
comment
RFC 2045 предназначен для электронных писем с кавычками, а не HTML. - person Sam Dufel; 19.03.2013
comment
Извините, но кажется, что даже добавление этой инструкции вообще ничего не меняет :-((( - person Roberto Alfieri; 19.03.2013

Используйте расширение PHP PDO для этого и всегда. Само расширение mysql устарело.

$pdo  = new PDO();// see reference docs for constructor arguments
$stmt = $pdo->prepare('UPDATE table set bfield=?');
$stmt->bind($image,PDO::PARAM_LOB);
$stmt->execute();

Я также заметил в вашем коде, что вы дважды кодируете данные base64. Измените base64_encode($riga[5]) на $riga[5], и ваш код должен работать, если только ваше текстовое поле не слишком маленькое.

person user1122069    schedule 18.03.2013
comment
TY за ваше предложение, я читал в руководстве по PHP изменение PDO/MySqli, но я собираюсь дурачиться, решая эту проблему, у меня сейчас нет головы, чтобы вводить новые концепции - будьте уверены, что я справлюсь с этим как как только смогу и снова TY - person Roberto Alfieri; 19.03.2013
comment
обратите внимание также на дополнение к ответу - я также заметил в вашем коде, что вы дважды кодируете данные base64. Измените base64_encode($riga[5]) на $riga[5], и ваш код должен работать, если только ваше текстовое поле не слишком маленькое. - Я думаю, это должно решить эту проблему. - person user1122069; 20.03.2013