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

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

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

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

Q&A

解決済

4回答

20760閲覧

formで取得した画像を確認画面で表示する方法

SugiuraY

総合スコア317

PHP

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

1グッド

1クリップ

投稿2017/02/22 11:12

お世話になります。

①画像を投稿するページ
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でも同時に複数のファイルに値を渡すという感覚は持っていないのですが、実際にどのように処理させればよろしいのでしょうか?

よろしくお願い申し上げます。

slimat👍を押しています

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

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

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

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

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

guest

回答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

yambejp

総合スコア114505

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

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

SugiuraY

2017/02/23 11:07

違う角度からのご回答ありがとうございます。目的はおっしゃる通りのため、情報を頂きありがとうございます
guest

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を利用し適当なディレクトリに移動してあげる必要があります。

POSTメソッドによるアップロード

ファイルの移動先として2つ候補が考えられます。

    1. Apache等のhttpdでアクセスできるディレクトリに移動する
    1. それ以外のディレクトリに移動する

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

nayuneko

総合スコア133

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

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

SugiuraY

2017/02/22 23:46

おはようございます。 ご回答ありがとうございます。 1.input.phpはまさにおっしゃるイメージです。 2.$tmp_filename = UPLOAD_TMP_DIR.basename($_FILES['img1']['tmp_name']); move_uploaded_file($_FILES['img1']['tmp_name'], $tmp_filename このコードが不思議だったのですが、postされた場合、confirm.phpで$_FILESで、受け取れるため、これを$_SESSIONに渡すでは誤りでしょうか?投稿が確定した際に、データベースに格納し、それまではSESSIONでもっていれば良いかと安易に考えていましたが、いちど必ずテンポラリディレクトに保存する理由をご教示願えますでしょうか? 3.2.の点を前提におなじimg.phpをSESSION変数で使い回すと思っていましたが、都度にテンポラリディレクトリからファイル自体を、削除する必要があるというご指摘でしょうか 宜しくお願い致します。
nayuneko

2017/02/23 01:17

【2について】 本文にも書きました通り、confirm.phpの処理が終わった時点でPHPによりファイルが削除されてしまうためです。 試しに、confirm.phpを以下のように直して確認してみてください。 ・confirm.php  $_SESSION['img1'] = $_FILES['img1']['tmp_name']; // /tmp/phpXXXXXX  echo file_exists($_SESSION['img1'])?'true':'false'; // true ・img.php  echo file_exists($_SESSION['img1'])?'true':'false'; // false 【3について】 上記の理由から、PHPの管理外のテンポラリファイルを削除しないとファイルがゴミとして残り続けるからです。
SugiuraY

2017/02/23 11:06

ご回答ありがとうございます。 非常に、わかりやすいご回答助かります。 言葉足らずで申し訳ございませんが、confirm.phpの処理はRDBへのバイナリデータとMIME情報の格納を含んでいるため、その処理後にファイルが削除されて問題ございません。
guest

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

ttyp03

総合スコア16996

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

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

SugiuraY

2017/02/23 11:08

ご回答ありがとうございます。 おっしゃる方法が当方も調べた限り、もっとも一般的なように思えます
guest

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
seastar3

総合スコア2285

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

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

SugiuraY

2017/02/22 23:47

ご回答頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問