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

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

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

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Q&A

2回答

4477閲覧

PHPフォーム処理でファイルアップロード時に戻るボタンを使われてしまったときの対処

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

0グッド

1クリップ

投稿2019/04/05 08:49

編集2019/04/05 08:51

前提・実現したいこと

  • フォーム入力→確認画面→完了(完了メール)
  • 確認画面にアップロードしたファイル名(複数)を表示。
  • 確認画面で「履歴バック」をされたときには、ファイルを削除。

試したこと

PHPを書いたことがなく、下記サイトを参考にファイルアップロード付きメールフォームを作ってます。
https://gray-code.com/php/make-the-form-vol8/

それに改変していますが、これで一応最低限の一連はできています。
確認画面(複数ファイル表示)、ファイルアップロード、確認メール。

改変したこと:

  • 一時ファイルディレクトリと正式ディレクトリを用意。
  • ファイル名の頭にユーザー名を加えました。
例外について対処したい

今回やったやり方だと良くも悪くも「一旦ファイルをサーバにアップロード」しています。

フォームを入力し確認画面に進む。
その後ユーザーが「(履歴)戻る」をする。
そして“違う”ファイルを選択し再び確認画面に進み完了させる。

こうなるとサーバーには2つアップロードされることになります。
今はとにかく処理を成功させるために、
ファイル名にユーザー名を追加して、そのファイル名にユーザー名を含んでいるファイルは正式ディレクトリへ移動するという行為を踏んでいます。

この場合受け取った側が「どちらが正しいファイル」なのか?わからなくなってしまいます。
またユーザーにしてみれば、それはキャンセルしたつもりになってますよね。

参考にしたプログラムの書き方だと、グローバル変数とローカル変数の関係で?変数を引き継げません。
最初の段階でファイル名に何かコード名を付けて、それを含んでなければ削除ってことをすれば良さそうですが、さっぱりわかりません。

代わりにJqueryを使ってJavaScriptでやることも考えたのですが、
今度はc:\fakepath\が表示されてしまったり、スマートに行きません。
※確認画面にも「ファイル名を表示」させたいです。

サーバーはCentOS6 PHP7です。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

登録が確定し、登録を処理する段階でmove_uploaded_file()関数にてを実行すればいいのではないかと思います。

それまで$_FILES関数には一時ファイルやファイル名しか入っておらず、これらはアップロードされなかった場合はサーバーから消去されます。幸い、ファイル名称や一時ファイルはアップロードしなくても残るので、ページを遷移できます。

ファイルアップロードの時に確認画面を挟むときのやり方

投稿2019/04/05 09:55

FKM

総合スコア3633

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

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

退会済みユーザー

退会済みユーザー

2019/04/05 11:45

ありがとうございます。 初歩的なところですいません。 $_FILESってスーパーグローバル変数で違うローカルにいっても保持しているのかと思ったのですが、 まずは確認画面でのファイル表示を諦め、 if ~ (1) elseif (2)で進んでますが、 (1)では何もせず(2)で処理を始めようとすると、 もう$_FILESは空になってしまうんですね。 参考先は同じPHPなのでしょうか? すいません、難しくて理解できないですね。
退会済みユーザー

退会済みユーザー

2019/04/08 10:11 編集

$_SESSION['TEMPFILE'][$COUNT] = file_get_contents($_FILES['FILE_TYPE_NAME']['tmp_name'][$ct]); $_SESSION['FILENAME'][$COUNT] = $_FILES['FILE_TYPE_NAME']['name'][$COUNT]; こんな感じにしてセッションに入れ確認画面に表示。 完了画面を出すタイミングで file_put_contents(FILE_DIRECTORY.$_SESSION['FILENAME'][$COUNT],$_SESSION['TEMPFILE'][$COUNT]); $FILEOUTPUT[$COUNT] = $_SESSION['FILENAME'][$COUNT]; としました。 前半でfile_get_contentsでセッションへ。 後半でfile_put_contentsでセッションから抜き出す。 これでJPEGやPDFやZipファイルは正常にアップロードできています。 そして最後の方で unset($_SESSION['FILENAME']); unset($_SESSION['TEMPFILE']); 一応これで確認画面でのファイル名出力、 さらにメールでのファイル名出力ができています。 このやり方にしてから履歴バックしたら、 戻ったときにファイル選択状態がクリアされるようになりました。 以前は残ってることが多かったです。 スマートなやり方じゃないとは思うんですが、 これは問題が出てくるのでしょうか?
FKM

2019/04/09 00:29

自分はその方法でも問題ないとは思いますが、もっと有識者の意見を訊きたいところですね。
退会済みユーザー

退会済みユーザー

2019/04/10 08:06 編集

変なところ?でエラーが出ました。 サーバにアップロードしたデータですが、 Webブラウザでそのファイルの内容を覗いたりダウンロードするとき、SFTP/WebDAVクライアントでダウンロードしたときは問題ありません。 Windows10でWebDAV(ネットワークドライブ)経由で、開いたりコピーしようとすると、ファイルを操作できないエラーが発生します。 PDFだと 「ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています」 .txtファイルだと、 ファイル名、ディレクトリ名、またはボリュームラベルの構文が間違っています。 これは俗に言われるWindows内蔵のWebDAVが悪いのでしょうか? ファイルの生成方法なのでしょうか? === 追記 上記はファイル名に余計な文字を追記していたことでWindowsで問題が起きていました。それを取り除いて解決しています。
guest

0

確認画面で「履歴バック」をされたときには、ファイルを削除。

これはブラウザの仕様によるけど、キャッシュが表示されると思うので無理じゃないかなぁ。。。

再投稿されたタイミングで削除できるように、セッションにアップロードの時のステータスを記録しておくと、登録前情報の削除はできるように思います。
*ちょっと仕様を勘違いしているかも^^;

参考にしたサイトの内容を斜めに読みましたが、いくつかのセキュリティ的な問題点を抱えています。
特に画像ファイルであることの確認をしていないことは致命的です。
もし現在インターネット上に公開中であればすぐに中止してサイト内のファイルにおかしな変化がないか確認したほうが良いです。
*雑にリスクを説明すると、php ファイルのアップロードが可能なので、php でできることが何でもできるようになります。(別のアップローダの設置、DB への接続、スパムの発射台、マイニングスクリプトの設置等々)

少し古い記事ですが、こちらを参考にしたほうが良いです。
ファイルアップロードの例外処理はこれぐらいしないと気が済まない

投稿2019/04/09 11:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/04/10 08:02

参考サイトの先にあった「PSR-7」ですが、良さそうに思ったんですが自分のサーバー(共用レンタル)だと使えないようです。 mimeタイプでのファイルチェックを付けました。 if($_FILES['添付ファイル']['error'][$count] === UPLOAD_ERR_OK) { if(!isset($_FILES['添付ファイル']['error'][$count]) || !array_search(mime_content_type($_FILES['添付ファイル']['tmp_name'][$count]),$allow_mime_array) || $_FILES['添付ファイル']['size'][$count] === 0) {echo "アップ失敗";} else { アップロード成功していて、対応ファイルの時のプログラム } } 一応これで動いています。 > いくつかのセキュリティ的な問題点 他に注意するところは何でしょうか?
退会済みユーザー

退会済みユーザー

2019/04/10 09:06

mimeタイプの検証は、簡単に回避できるためセキュリティ的にはほとんど意味がありません。(やらないよりはやったほうが良いですが) 画像ファイルの検証ができないのであれば、そのサーバでのファイルアップロード機能実装は諦めてください。 > 他に注意するところは何でしょうか? そもそもバリデーションが出来てないので、細かい指摘をしても意味は無いのですが、 ・htmlspecialchars の第三引数の指定がない ・images/test/ は多分公開ディレクトリで、直接アクセス可能 等々。 斜め読みなので、網羅的でも無ければ、検証もしていないですが、公開に耐えるものではないです。
退会済みユーザー

退会済みユーザー

2019/04/10 09:43

> mimeタイプの検証は、簡単に回避できるためセキュリティ的にはほとんど意味がありません。 これ、間違いです。 $_FILES の内容で mime タイプチェックしていると読んでました。失礼^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問