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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3870閲覧

php input fileでアップロードしてリサイズした画像をDBに登録したい

earnest_gay

総合スコア615

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/01/26 04:09

input fileでアップロードしたファイルの詳細は$_FILESで見れますが、
実際input fileでHTTP送信して$_FILESに反映されるまでの処理はどのように行われているのでしょうか?

例えばtest.pngをアップロードして

$file_path = $_FILES["upfile"]["tmp_name"]; $file_type = $_FILES["upfile"]["type"]; $file_name = $_FILES["upfile"]["name"]; $file = file_get_contents($file_path); $file = mysql_real_escape_string($file); // ログインユーザーのidがなければ新規登録、あれば更新処理。 $sql = "INSERT IGNORE INTO user_image"; $sql .= " (user_id,file,type,name)"; $sql .= " VALUES ('$id','$file','$file_type','$file_name')"; $sql .= " ON DUPLICATE KEY UPDATE"; $sql .= " file = '$file'"; $sql .= " ,type = '$file_type'"; $sql .= " ,name = '$file_name'"; $stmt = $pdo->query($sql);

でDB登録できます。

test.pngのサイズが例えば1000px * 1000pxだったとしましょう。
でも小さい画像も欲しいです。

$id = 70; if (isset($_POST["submit"])){ //取得サイズリスト作成 for($px=25;$px<=500;$px+=25) { if($px <= 100) { //25px単位 $size_list[] = $px; } else { //50px単位 if($px % 2 == 0) { $size_list[] = $px; } } } $file_path = $_FILES["upfile"]["tmp_name"]; $file_type = $_FILES["upfile"]["type"]; $file_name = $_FILES["upfile"]["name"]; $extension = end(explode("_",str_replace(".","_",$file_name)));//拡張子 if($file_path == true) { //オリジナルの幅、高さ、ファイル種別を取得。 list($width_original,$height_original,$type_num) = getimagesize($file_path); foreach ($size_list as $key => $value) { $prefix = sprintf('%03d',$value); $save_path = "image/example_".$prefix.".".$extension; // 画像保存先のパス $new_height = $value; $new_width = round($width_original*$new_height/$height_original); //画像生成 $resize_file = ImageCreateTrueColor($new_width , $new_height); switch($type_num){ case IMAGETYPE_JPEG: $target_file = ImageCreateFromJPEG($file_path); break; case IMAGETYPE_PNG: imagealphablending($resize_file, false); imagesavealpha($resize_file, true); $target_file = ImageCreateFromPNG($file_path); break; case IMAGETYPE_GIF: $target_file = ImageCreateFromGIF($file_path); break; } ImageCopyResampled($resize_file, $target_file,0,0,0,0, $new_width, $new_height, $width_original, $height_original); switch($type_num){ case IMAGETYPE_JPEG: ImageJPEG($resize_file,$save_path); break; case IMAGETYPE_PNG: ImagePNG($resize_file,$save_path); break; case IMAGETYPE_GIF: $bgcolor = imagecolorallocatealpha($target_file,0,0,0,127); imagefill($resize_file, 0, 0, $bgcolor); imagecolortransparent($resize_file,$bgcolor); ImageGIF($resize_file,$save_path); break; } /* ここでINSERT処理を行いたいが、どう繋げればいいのかがわからない。 */ } // ファイル取得 $file = file_get_contents($file_path); $file = mysql_real_escape_string($file); // ログインユーザーのidがなければ新規登録、あれば更新処理。 $sql = "INSERT IGNORE INTO user_image"; $sql .= " (user_id,file,type,name)"; $sql .= " VALUES ('$id','$file','$file_type','$file_name')"; $sql .= " ON DUPLICATE KEY UPDATE"; $sql .= " file = '$file'"; $sql .= " ,type = '$file_type'"; $sql .= " ,name = '$file_name'"; $stmt = $pdo->query($sql); } }

/*
ここでINSERT処理を行いたいが、どう繋げればいいのかがわからない。
*/

$file_path = $_FILES["upfile"]["tmp_name"];
$file = file_get_contents($file_path);
$file = mysql_real_escape_string($file);
↑これがわかれば正常に登録できると思いますが
$_FILES["upfile"]["tmp_name"]はinput fileからアップロードした結果です。

$save_pathに保存した画像をどうやって、$_FILES["upfile"]["tmp_name"]に相当するものにするのかその方法がわかれば以降の

$file = file_get_contents($file_path);
$file = mysql_real_escape_string($file);

もできるのですが、どうすればよいでしょうか?

オリジナル画像を取り出してCSSでサイズ制御すればいいのでしょうが、
それをするかしないかはまだわからないので、
現段階では本質問の内容が知りたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2017/01/26 04:18

何をやりたいのか、もっと明確に記載した方が良いです。リサイズはできていて、そのリサイズ後の画像(A)をDBに登録したいということなのか、Aをクライアントに返却したいのか、その両方なのか
guest

回答2

0

ベストアンサー

まず前提として・・・
pdoで処理するのにsqlに変数をダイレクトで書いたり
ましてやmysql_real_escape_string()のような処理をいれたりするのは
考え方がおかしいです。

それはともかく
ファイルの中身を変数に受けたいというだけであれば
普通にfopenしてfreadすればいいですが、ファイルI/Oが面倒なら
ob関数で処理してもよいかもしれません

PHP

1<form enctype="multipart/form-data" method="post"> 2<input type="file" name="myfile"> 3<input type="submit" value="go"> 4</form> 5<?PHP 6if(isset($_FILES["myfile"])){ 7 ob_start(); 8 readfile($_FILES["myfile"]["tmp_name"]); 9 $contents=ob_get_contents(); 10 ob_end_clean(); 11 print $contents; 12} 13?>

投稿2017/01/26 04:22

yambejp

総合スコア114833

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2017/01/26 04:27

すいません、 $file = file_get_contents($file_path); $file = mysql_real_escape_string($file); の部分はPDOではどのようにしたらいいんでしょうか?
turbgraphics200

2017/01/26 04:35

てか、そもそも$fileはバイナリーデータだからmysql_real_escape_string()は不要です。
earnest_gay

2017/01/26 04:48

前にprepare,executeでやったんですが、DB格納してそれをDLして、binを対応拡張子に変えて開こうとすると、ファイルが壊れているとかで見れなかったんです。 いろいろ調べて手当たり次第やってみたら $file = file_get_contents($file_path); $file = mysql_real_escape_string($file); でできたのでそのままにしてるんですが、確かにpdo使ってるならmysql_real_escape_stringは不要だと思うのでなんとかしたいのですが、executeでバインドすると、破損してるってなるんです。
yambejp

2017/01/26 05:22

テーブルの当該カラムがbinary系もしくはBLOB系で持てばPDOによる データの損失は発生しないはずです
guest

0

php

1$file_path = $_FILES["upfile"]["tmp_name"];

$file_pathという変数名が示唆するように、$_FILESの中身はファイルパスです(配列の内容の詳細)。

ということで、自分で作ったファイルをDBにロードしたいなら、file_get_contents(作成した一時ファイルのパス)として、あとは同様に進められます。

投稿2017/01/26 04:17

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2017/01/26 04:36

ありがとうございます。 リサイズの画像はとりあえず保存させていますが、できれば保存させずにリサイズ後そのままDBに登録したいと考えています。 なにか方法はないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問