【发布时间】:2014-07-20 11:17:43
【问题描述】:
我构建了一个简单的表单,用于将图像连同描述一起上传到数据库中。图像和描述存储在数据库中,但我很难检索/渲染(?)图像。我认为数据库连接没问题,因为我实际上可以上传东西。我将在下面留下代码和一些打印屏幕:
表格:
上传.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 的最终结果:
那么,关于如何使图像显示的任何建议?
【问题讨论】:
-
作为一般提示,您应该避免使用 mysql_* 样式函数并使用 mysqli 或 pdo_mysql,因为它们已被弃用。它们有助于避免您的脚本当前可能受到影响的 SQL 注入攻击。至少你应该在任何输入上使用 mysql_real_escape_string() 在查询中使用它之前
-
您可能还考虑是否需要将图像存储在数据库中(而不是对它们的引用); stackoverflow.com/questions/527801/…有一些有趣的地方
标签: php mysql database upload image-uploading