0

私のmysqlデータベースから画像を表示する際に大きな問題が発生しました

ロングブロブ型で保管しています

画像が表示されると、壊れた画像アイコンが表示されます

ここに画像を保存するためのコードがあります

if(isset($_FILES['image']) && $_FILES['image']['size'] > 0 && isset($_POST['photoName']))
{
    //temporary file name
    // Temporary file name stored on the server
    $tmpName = $_FILES['image']['tmp_name'];
    $imageType = $_FILES['image']['type'];

    // Read the file
    $fp = fopen($tmpName, 'r');
    $data = fread($fp, filesize($tmpName));
    $data = addslashes($data);
    fclose($fp);


    $sql="INSERT INTO photos (photoName, caption, photoData, photoType, userName)
        VALUES
        ('$_POST[photoName]','$_POST[caption]','$tmpName','$imageType', '$currentUser')";

    //For debugging purposes
    if(!mysqli_query($con,$sql))
    {
        die('Error: ' . mysqli_error($con));
    }
    else
    {
        echo "Your Image has been Added";
    }   
}

次に、画像を印刷します

if(isset($_POST['usersImage'])){
        //code to show images
        $user = $_POST['usersImage'];
        $sql = "SELECT * FROM `photos` WHERE userName = '$user'";
        $result = mysqli_query($con,$sql);
        while($row = mysqli_fetch_array($result)) 
        {
            switch ($row['photoType']) {
                case 'image/jpeg':

                echo "<tr>";  
                echo '<img src="data:image/jpeg;base64,'. base64_encode($row['photoData'])."\"></td>";   
                echo "</tr>"; 
                    //echo '<img src="image>' .$row['photoData']. '.jpeg'.'</p>';
                    //echo '<p id="caption">'.$row['caption'].' </p>';
                break;
            }           
        }
    }

ご覧のとおり、私の最近の試みはbase64エンコーディングを使用して画像を印刷することでした。以前の試みはコメントアウトされたコードでした

4

2 に答える 2

3

画像を表示するときは、それ自体のリクエストからのものでなければなりません。src=""には、正しい MIME ヘッダーでコンテンツを配信するスクリプトへの URL が含まれている必要がありますimage/jpeg

<?php
    $photo_bin = //binary data from query here;

    header("Content-Type: image/jpeg"); // or whatever the correct content type is.
    echo $photo_bin;

imgブラウザーがタグからリクエストできる php スクリプトの簡単な例^ 。

于 2013-03-16T17:41:35.317 に答える
1

検証は重要です。あなたは非常に多くのセキュリティ問題に直面しています。

SQL ステートメント内で $_POST / $_GET を使用しないでください。それらをエスケープします。さらに良いのは、PDO ステートメントを使用することです。イメージが実際にイメージであることを検証します。この時点で、テーブルに任意のタイプのファイルを入力できます。

お気づきのように、画像をデータベースに保存するのは、ファイル システムに保存するよりもはるかに困難です。通常、イメージをファイルシステムに保存するための引数は、テーブル内よりもはるかに多くあります。

挿入コードをざっと見てみると、なぜバイナリ データにスラッシュを追加しているのかよくわかりません。addlahes への呼び出しを削除して、それを試してください。

于 2013-03-16T17:44:28.680 に答える