質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

テーブルに.jpg形式の画像をアップロードすると中身が文字化けしており確認が取れない

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 354

Ms.yy

score 51

発生している問題・エラーメッセージ

DBのテーブルに.jpg形式の画像をアップロードするとテーブルの中身が文字化けとなるのですが、どなたか解決方法分かる方がいらっしゃればご教授お願いしたいです。

エラーメッセージ

イメージ説明
イメージ説明
イメージ説明

作成したテーブル

mysql> CREATE TABLE IF NOT EXISTS `posts` (
    ->   `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    ->   `imgdat` blob NOT NULL,
    ->   `mime` VARCHAR(64) NOT NULL,
    ->   PRIMARY KEY (`ID`)
    -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

 ```  

edit.php

<form enctype="multipart/form-data" action="login" method="POST">  
<input type="hidden" name="MAX_FILE_SIZE" value="300000" />  
<input name="image" type="file" />  
<p><input type="submit" name="save" value="Submit" /><p>  
{{ csrf_field() }}  
</form>  

<?php  
$url = "localhost";  
$user = "root";  
$pass = "";  
$db = "myblog";  

if (!empty($_POST))  
{  
// バイナリデータ  
$fp = fopen($_FILES["image"]["tmp_name"], "rb");  
$imgdat = fread($fp, filesize($_FILES["image"]["tmp_name"]));  
fclose($fp);  
$imgdat = addslashes($imgdat);  

// 拡張子  
$dat = pathinfo($_FILES["image"]["name"]);  
$extension = $dat['extension'];  

// MIMEタイプ  
if ( $extension == "jpg" || $extension == "jpeg" ) $mime = "image/jpeg";  
else if( $extension == "gif" ) $mime = "image/gif";  
else if ( $extension == "png" ) $mime = "image/png";  

// MySQL登録  
$link = mysqli_connect( $url, $user, $pass ) or die("MySQLへの接続に失敗しました。");  
$sdb = mysqli_select_db( $link,$db) or die("データベースの選択に失敗しました。");  
$sql = "INSERT INTO `myblog`.`posts` (`imgdat`, `mime`) VALUES ('".$imgdat."', '".$mime."')";  

$result = mysqli_query( $link,$sql) or die("クエリの送信に失敗しました。");  
mysqli_close($link) or die("MySQL切断に失敗しました。");  
}  
?>  

view.php

<?php  
$url = "localhost";  
$user = "root";  
$pass = "";  
$db = "myblog";  

$link = mysql_connect( $url, $user, $pass ) or die("MySQLへの接続に失敗しました。");  
$sdb = mysql_select_db( $db, $link ) or die("データベースの選択に失敗しました。");  
$sql = "SELECT * FROM myblog.posts";  
$result = mysql_query( $sql, $link ) or die("クエリの送信に失敗しました。");  
$rows = mysql_num_rows( $result );  
mysql_close( $link ) or die("MySQL切断に失敗しました。");  

if($rows){  
while($row = mysql_fetch_array($result)) {  
echo '<img src="posts/edit?id='.$row["ID"].'" />';  
}  
}  
?>  

create_mage.php

<?php  
$url = "localhost";  
$user = "root";  
$pass = "";  
$db = "myblog";  

$id = $_GET['id'];  

$link = mysqli_connect( $url, $user, $pass ) or die("MySQLへの接続に失敗しました。");  
$sdb = mysqli_select_db( $db, $link ) or die("データベースの選択に失敗しました。");  
$sql = "SELECT * FROM myblog.posts WHERE ID = '".$id."'";  
$result = mysqli_query( $sql, $link ) or die("クエリの送信に失敗しました。");  
$rows = mysqli_num_rows( $result );  
mysqli_close( $link ) or die("MySQL切断に失敗しました。");  

if( $rows ){  
while($row = mysqli_fetch_array($result)) {  
header( "Content-Type: ".$row['mime'] );  
echo $row['imgdat'];  
}  
}  
?>  

補足情報(FW/ツールのバージョンなど)

OS:mac
php ver:7.1
mysql ver:5.6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/01/06 09:11

    create_mage.php にて出力したものに問題がありますか?

    キャンセル

回答 3

+3

DBのテーブルに.jpg形式の画像をアップロードするとテーブルの中身が文字化けとなるのですが

これで問題ありません。JPEG画像はバイナリファイルですので、文字として表示しても意味のある表示にはなりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/06 18:56

    なるほどです。
    とりあえずエラーではないとみなさんから回答頂いたので安心しました^^

    キャンセル

checkベストアンサー

+2

既に出ている回答の通り、問題は起きていません。画像をPCのビューワーなどでなく、テキストエディタなどで開いてみるとその理由がわかります。

ご自身でもちゃんとfreadでバイナリデータ化して保存されているのできちんと組んだ通りに処理されています。

ただ、
そもそも「画像をDBに保存すべきか否か」も検討いただきたく。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/06 18:59

    とりあえずエラーではないと安心しました。

    本来は画像のパスで保存がいいみたいですね、直接保存ではなくその方向で調べてみます!

    キャンセル

  • 2020/01/06 19:03

    ネットから拾い集めたコードはバグだらけと思ってください。
    自身で理解できないのに使っていると結局身につきません。(デバッグ依頼のような内容になっています)

    キャンセル

+2

view.phpのmysql_関数はすでにメインバージョンでは削除された関数です
自力でなんとかできないなら使わないでください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/06 09:28 編集

    teratailの仕様がかわったのかほんとに調子悪いです
    (以下追記)

    できればpdoの利用を検討ください
    edit.phpで、バイナリデータを中途半端なエスケープ処理で
    テーブルに投入していますがNGです。
    かならずprepareで処理してください

    create_mage.php(create_image.php??)では
    header('Content-Type: image/jpeg');
    を出力するように

    キャンセル

  • 2020/01/06 09:36 編集

    質問者のコードに混在してますね。
    mysqlとi

    キャンセル

  • 2020/01/06 18:57

    参考にしたサイトはmysqlだったのでそれだとエラーとなったのでmysqliに変更しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • テーブルに.jpg形式の画像をアップロードすると中身が文字化けしており確認が取れない