无法从DB检索图像

时间:2014-05-30 16:11:44

标签: php mysql database upload image-uploading

我构建了一个简单的表单,用于将图像上传到数据库中以及描述。图像和描述存储在数据库中,但我很难检索/渲染(?)图像。我认为数据库连接正常,因为我可以实际上传内容。我将在下面给你留下代码和一些打印屏幕:

表:

enter image description here enter image description here

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的最终结果:

enter image description here

那么,有关如何制作图像的任何建议?

4 个答案:

答案 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']);,我相信它会起作用。