ここから本文です

PHPでデータベースに画像を保存するシステムを作っているのですが大きいサイズの画...

not********さん

2019/9/813:45:44

PHPでデータベースに画像を保存するシステムを作っているのですが大きいサイズの画像を保存することが出来ません(小さいサイズの画像は普通に保存できます。

そこで画像を比率を維持しながらリサイズしてデータベースに保存したいのですがいろいろ試してもリサイズして画像を保存できません。
下記のコードで上記の動作を実行するにはどのようにしたら良いのでしょうか。

---HTML----
<form method="POST" action="./save.php" enctype="multipart/form-data">
<input type="file" name="image">
<input type="text" name="img_name">
<input type="text" name="your_name">
<input type="submit" name="icon" value="アイコン更新">
</form>



---PHP---
<?php
$name=$address=$login=$password='';
if (isset($_SESSION['customer'])) {
$name=$_SESSION['customer']['name'];
$address=$_SESSION['customer']['address'];
$login=$_SESSION['customer']['login'];
$password=$_SESSION['customer']['password'];
}
?>
<?php
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = 'staff';
$pw = 'password';
$driver_options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];


$pdo = new PDO(
$dsn,
$user,
$pw,
$driver_options
);

$sql = '
DELETE FROM image_data WHERE id NOT IN (
SELECT Max_id FROM (
SELECT MAX(id) Max_id FROM image_data GROUP BY img_name
) tmp
)
';
$sql = '
INSERT INTO
`image_data` (img, img_name, user)
VALUES
(:img, :img_name, :user)
';



// 画像データ
$img_data = (!empty($_FILES['image']['tmp_name'])) ? file_get_contents($_FILES['image']['tmp_name']) : NULL;

// DBに保存
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':img', $img_data);
$stmt->bindValue(':img_name', $_POST['img_name']);
$stmt->bindValue(':user', $_POST['your_name']);
$stmt->execute();
?>

この場合どのようにすると比率を維持しながらリサイズして画像をデータベースに保存できるのでしょうか。
画像は最大横400pxで保存したいです。

閲覧数:
37
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

shimixさん

2019/9/816:10:37

>比率を維持しながらリサイズして画像をデータベースに保存

とりあえず、地道に書くやり方で書くと(jpgとpngを対象と仮定して)

if (isset($_FILES['image'])) {
if ($imgdata = file_get_contents($_FILES['image']['tmp_name'])) {
$img = imagecreatefromstring($imgdata);
list($width, $height, $type) = getimagesizefromstring($imgdata);
$new_width = $width;
$new_height = $height;
if ($width > $height) {
if ($width > 400) {
$new_width = 400;
$new_height = round($height * 400 / $width);
}
} else {
if ($height > 400) {
$new_height = 400;
$new_width = round($width * 400 / $height);
}
}
$new_img = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
$fname = tempnam(__DIR__, 'IMG_');
if ($type == IMAGETYPE_JPEG) {
imagejpeg($new_img, $fname);
$data = file_get_contents($fname);
}
if ($type == IMAGETYPE_PNG) {
imagepng($new_img, $fname);
$data = file_get_contents($fname);
}
unlink($fname);
imagedestroy($img);
imagedestroy($new_img);
}
}


といった感じでしょうか・・・。$data に画像データが格納されているので、これを保存すればいいと思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

2019/9/816:46:54

Apacheとか、データーベース側の設定なんじゃね?

とは、全く別に。
画像はデーターベースに入れるな!パスだけにしろ。
的な意見はあるけど、それはどうしても入れたい?

なにか必要性があるのならいいけど、データーベースにはバイナリーデータは入れないほうがいろいろと楽かもね、という話はある。

fxh********さん

2019/9/814:10:33

「大きいサイズの画像を保存することが出来ません」のエラーメッセージ次第ですが
POSTサイズ上限、データベース列 image_data.img のサイズ上限が考えられます。

リサイズは $img_data 代入後に画像操作ライブラリで変換処理します。

DBへINSERTする以前にブラウザに表示できることを確認すると問題を切り分けやすいです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

このカテゴリの回答受付中の質問

一覧を見る

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる