お世話になります。
①画像を投稿するページ
input.php
②上記の投稿ページからPOSTメソッドのアクションとして飛び内容を確認するページ
confirm.php
③Content-Type:image/jpegのヘッダーで画像を処理するページ
img.php
の3つのページがあります。
一旦、RDBを経由せずに確認画面であるconfirm.phpで画像を表示させたいのですが、方法のアドバイスをください。
これまで調べた結果、ヘッダーはそれぞれのページで一つであることから、外のimg.phpを作成して、これをimg src="img.php" という形が一般的であるということまでわかりました。
ただ、ここでわからない点は、POSTで画像のデータを$_FILESの中に格納して、confirm.phpには渡すことができるのですが、img.phpに同時にどのようにデータを渡すのかがわかりません。
POSTでもSessionでも同時に複数のファイルに値を渡すという感覚は持っていないのですが、実際にどのように処理させればよろしいのでしょうか?
よろしくお願い申し上げます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
画像を何のためにconfimで一度表示したいかによりますね
単に選んだ画像がただしいかどうかをユーザーに確認させたいだけなら
送る前にチェックさせられます
javascript
1<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script> 3$(function(){ 4 $('input[type=file]').on('change',function(){ 5 var me=$(this); 6 var file = $(this).prop('files')[0]; 7 var fr = new FileReader(); 8 if(file.type.match(/^image/)){ 9 me.next('.myimgs').remove(); 10 var imgtag=$('<img alt="test" class="myimgs" width="100">'); 11 me.after(imgtag); 12 fr.onload = function() { 13 imgtag.attr('src', fr.result); 14 } 15 fr.readAsDataURL(file); 16 } 17 }); 18}); 19 20</script> 21<form action="confirm.php" method="post" enctype="multipart/form-data"> 22<input type="file" name="img1"><br> 23<input type="file" name="img2"><br> 24<input type="file" name="img3"><br> 25<input type="submit" value="upload"> 26</form> 27
投稿2017/02/23 01:55
総合スコア114572
0
input.phpでは、以下のような感じでファイルを送信しているという認識でよろしいでしょうか?
html
1<form action="confirm.php" method="post" enctype="multipart/form-data"> 2<input type="file" name="img1" /> 3<input type="submit" value="ファイルを送信" /> 4</form>
アップロードされたファイルの実態はPHPによってテンポラリディレクトリに保存され、保存されたファイル名が$_FILES['img1']['tmp_name']
に格納されます。このファイルはconfirm.php
がWebブラウザにレスポンスを返しきった時点で自動的に削除されてしまいますので、move_uploaded_file
を利用し適当なディレクトリに移動してあげる必要があります。
ファイルの移動先として2つ候補が考えられます。
-
- Apache等のhttpdでアクセスできるディレクトリに移動する
-
- それ以外のディレクトリに移動する
1の場合、img.php
など経由せずパスを指定してあげれば直接アクセスできるようになります。
2の場合、img.php
でファイルを読み込み、画像ファイルのヘッダと一緒に返却してあげることによって画像の表示を実現します。
今回のご質問は2の方法で、かつimg.php
にどのようにファイル名を渡してあげるかとのことですが、セッションが使えるのでしたら、移動後のファイル名をセッションで受け渡してあげれば問題ないと思います。
GETパラメータで受け渡してあげる方法もありますが、ファイル名がURLに表出してしまうのはセキュリティ上あまりよろしくないので、セッションを利用した方が無難だと思われます。
以下のコードは一例です。
confirm.php
php
1<?php 2session_start(); 3if (is_uploaded_file($_FILES['img1']['tmp_name'])){ 4 $tmp_filename = UPLOAD_TMP_DIR.basename($_FILES['img1']['tmp_name']); 5 move_uploaded_file($_FILES['img1']['tmp_name'], $tmp_filename); 6 $_SESSION['img1'] = $tmp_filename; 7?> 8 <img src="img.php" /> 9<?php 10} else { 11?> 12エラー
img.php
php
1<?php 2session_start(); 3header('Content-type: image/jpeg'); 4readfile($_SESSION['img1']);
最後にこのコードだけですと問題がありまして、move_uploaded_file
で一旦移動したファイルは自主的に消してあげない限り永遠に残り続けます。
confirm.php
というファイル名から察しまして、恐らく確認画面でキャンセル処理もできると推察されますが、一旦キャンセルしてファイルを上げ直した場合、最初にアップロードしたファイルは利用されないにも関わらず、残り続けます。
なので、バッチなどで定期的に使っていないファイルを削除してあげる必要があるかもしれません。
投稿2017/02/22 17:03
総合スコア133
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/23 01:17
2017/02/23 11:06
0
実際に試したわけではないですし、標準的な方法かどうかもわかりませんが、セッションに画像データ自体を入れてしまうのはいかがでしょうか。
confirm.php
PHP
1session_start(); 2$_SESSION['upimg'] = file_get_contents($_FILES['upimg']['tmp_name']); 3echo '<img src="img.php">';
img.php
PHP
1session_start(); 2header('Content-type: image/jpeg'); 3echo $_SESSION['upimg']);
confirmからの飛び先.php
PHP
1session_start(); 2file_put_contents(ファイル名, $_SESSION['upimg']);
セッション自体に画像データを入れてしまうことで、後始末などの面倒な処理が省けるのが利点かと思います。
投稿2017/02/23 01:59
総合スコア16996
0
画像ファイルが元々あるのなら、リダイレクト先のconfirm.phpへファイルパスまたはURL先の$img_pathと画像ファイル名$img\fileを送り、次のコードを吐き出させて表示させます。
php
1echo "<img src='".$img_path."//".$img_file."//>"; 2
また、画像ファイルが一時的にアップロードされたり、グラフのように画像生成されるのなら、
php
1echo "<img src='http://ドメイン名/img.php?withd=".$width."&height=".$height."'//>"; 2
などとURL引数を介して画像生成させて返させます。
投稿2017/02/22 15:11
編集2017/02/22 15:18総合スコア2285
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/23 11:07