我构建了一个简单的表单,用于将图像上传到数据库中以及描述。图像和描述存储在数据库中,但我很难检索/渲染(?)图像。我认为数据库连接正常,因为我可以实际上传内容。我将在下面给你留下代码和一些打印屏幕:
表:
upload.php的
<form action="imageUpload.php" method="post" enctype="multipart/form-data">
<label for="userFile">Upload your file: </label>
<input type="file" size="40" name="userFile" id="userFile"/><br />
<br />
<label for="altText">Description of image</label>
<textarea class="ckeditor" name="altText" id="altText"/></textarea><br />
<br />
<input type="submit" class="pdf" value="Save!" />
</form>
imageUpload.php
<?php
if ( !isset($_FILES['userFile']['type']) ) {
die('<p><strong>Du har inte laddat upp någon bild!</strong></p></body></html>');
}
?>
Your image:<br /><br />
Temporary name: <?php echo $_FILES['userFile']['tmp_name'] ?><br />
Original name: <?php echo $_FILES['userFile']['name'] ?><br />
Size: <?php echo $_FILES['userFile']['size'] ?> bytes<br />
Type: <?php echo $_FILES['userFile']['type'] ?></p>
<?php
require '../scripts/common.php';
// Validate uploaded image file
if ( !preg_match( '/gif|png|x-png|jpeg/', $_FILES['userFile']['type']) ) {
die('<p>Bara gif, png eller jpg/jpeg filer är accepterade!</p></body></html>');
} else if ( strlen($_POST['altText']) < 9 ) {
die('<p>Please write more then 9 characters!</p></body></html>');
} else if ( $_FILES['userFile']['size'] > 5000000 ) {
die('<p>Your image is too big!</p></body></html>');
// Connect to database
} else if ( !($link=mysql_connect($host, $username, $password)) ) {
die('<p>Could not connect to DB</p></body></html>');
} else if ( !(mysql_select_db($dbname)) ) {
die('<p>Error when connecting to DB</p></body></html>');
// Copy image file into a variable
} else if ( !($handle = fopen ($_FILES['userFile']['tmp_name'], "r")) ) {
die('<p>Could not open temp file!!</p></body></html>');
} else if ( !($image = fread ($handle, filesize($_FILES['userFile']['tmp_name']))) ) {
die('<p>Error when reading the temp file!</p></body></html>');
} else {
fclose ($handle);
// Commit image to the database
$image = mysql_real_escape_string($image);
$alt = htmlentities($_POST['altText']);
$query = 'INSERT INTO image (type,name,alt,img) VALUES ("' . $_FILES['userFile']['type'] . '","' . $_FILES['userFile']['name'] . '","' . $alt . '","' . $image . '")';
if ( !(mysql_query($query,$link)) ) {
die('<p>Could not save info on the DB!</p></body></html>');
} else {
die('<p>Your info has been saved!</p></body></html>');
}
}
?>
getImage.php
<?php
require '../scripts/common.php';
$link = mysql_connect($host, $username, $password);
mysql_select_db($dbname);
$query = 'SELECT type,img FROM image WHERE id="' . $_GET['id'] . '"';
$result = mysql_query($query,$link);
$row = mysql_fetch_assoc($result);
header('Content-Type: ' . $row['type']);
echo html_entity_decode($row['img']);
?>
showimage.php
<?php
require '../scripts/common.php';
if ( !($link=mysql_connect($host, $username, $password)) ) {
die('<p>Kunde inte koppla med databasen!</p></body></html>');
} else if ( !(mysql_select_db($dbname)) ) {
die('<p>Fel att läsa databasen!</p></body></html>');
} else {
$query = "SELECT id,name,alt FROM image";
if ( !($result = mysql_query($query,$link)) ) {
die('<p>Kunde inte läsa databasen!</p></body></html>');
} else {
for ( $i = 0 ; $i < mysql_num_rows($result) ; $i++ ) {
$row = mysql_fetch_assoc($result);
echo '<article class="span12 post">
<div class="mask3 span3">
<img src="getImage.php?id=' . $row['id'] . '" alt="' . $row['alt'] . '" title="' . $row['name'] .'"/>
</div>
<div class="inside">
<div class="span8 entry-content">
<div class="span12">
' . $row['alt'] . '
</div>
</div>
</div>
</article>';
}
}
}
?>
showimage.php的最终结果:
那么,有关如何制作图像的任何建议?
答案 0 :(得分:1)
我怀疑&#34; updload&#34;是否存在问题。图像。致mysql_real_escape_string
的电话是扫描&#34;字符&#34;需要转义,并在任何&#34;不安全&#34;之前插入反斜杠字符。字符。
如果$image
是二进制数据(我没有看到任何base64或十六进制编码/解码),我怀疑你真的不想改变二进制数据。
鉴于您已经获得的内容,将二进制数据转换为十六进制格式可能适用于INSERT(只要SQL文本的长度不超过max_allowed_packet
)。
... , img ) VALUES ( ... , x'FFD8FFE00004A464946000102' )
另一种选择是使用MySQL LOAD_FILE
函数来读取位于MySQL服务器主机上的文件的内容。同样,max_allowed_packet
限制了可以通过这种方式加载的文件的大小。
... , img ) VALUES ( ... , LOAD_FILE('/tmp/img.jpg') )
答案 1 :(得分:0)
如果图像是blob或普通二进制数据,请使用数据URIS- https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs
答案 2 :(得分:0)
狂野的猜测在这里。试图弄明白并提供可能有助于解决问题的信息。 我从来没有把二进制文件放到MySQL中(所以我不知道用BLOB逃避要求,如果有的话?????)
(确保它不是CSS的东西。: - ))
<?php
require '../scripts/common.php';
$link = mysql_connect($host, $username, $password);
mysql_select_db($dbname);
$query = 'SELECT type,img FROM image WHERE id="' . $_GET['id'] . '"';
$result = mysql_query($query,$link);
$row = mysql_fetch_assoc($result);
header('Content-Type: ' . $row['type']);
echo html_entity_decode($row['img']); //Is enough being echoed here?
?>
// html_entity_decode() on a BLOB? [PHP Manual: html_entity_decode()][1]
<div class="mask3 span3">
<img src="getImage.php?id=' . $row['id'] . '" alt="' . $row['alt'] . '" title="' . $row['name'] .'"/>
</div>
如果在getImage.php的最后一行回显了足够的内容。是否需要文件名?
如果您使用的是<base>
HTML标记,则可能不必指定完整的网址。
答案 3 :(得分:0)
如果在getImage.php
内,您回复row['img']
而不是html_entity_decode($row['img']);
,我相信它会起作用。