[英]MySQL: How to store a file into a medium blob field binary with HEX
[英]MySQL and BLOB field impossible to upload/display images from PHP (but it works manually) / 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>
但是,如果我使用phpmyadmin在blob字段中手动上传相同的图像,则效果很好。 即使我转储内容,也始终使用phpmyadmin,下载.bin文件并将其重命名为.jpg,它的工作原理非常完美。
问题是,当我使用phpmyadmin上传图像时,我看到它会将数据转换为十六进制格式,并生成如下SQL语句:
UPDATE `AdVisual_02_`.`adv_eventclassification` SET `Logo_Eve` = 0xffd8ffe0001 ...
0acf43a5a97a6089ffd9 WHERE `adv_eventclassification`.`Cod_Classification` = 61;
我该怎么办? 我哪里错了? 自三天以来我对此感到疯狂!!!!! 多亏任何好朋友会尽力帮助我
问题是将文件保存到数据库的方式。 您想显示图像内联html,这对于1kb以下的很小的图像是很好的,不建议用于较大的文件。 在这种情况下,使用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算法再次转换此文本以进行输出
有趣的文章阅读:
尝试使用.chunk_split(base64_encode($riga[5])).
按照关于在PHP中从MySQL中提取BLOB图像数据的回答 。 您的Base64编码图像的数据字符串可能太长,需要将其“分块”后再回显到文档中,以符合RFC 2045:
qp-part:= qp-section; 最大长度为76个字符
从另一个编辑器(或BLOB查看器)复制/粘贴时,这似乎是“单独”排序的 ,但是在检索记录的值时,它不会自动以echo
进行排序。
为此,请始终使用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],除非文本字段太小,否则您的代码应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.