PHPでファイルのバッチアップロードの実装方法

このQ&Aのポイント
  • PHP初心者による、ウェブサイトでのバッチアップロード機能の実装方法について。
  • テンポラリー情報を格納するテーブルを作成し、フォームを用いてファイル情報を格納する方法と、全てのファイル情報を確認してアップロードする方法について説明。
  • PHPとHTMLを使用し、必要に応じてJavaScriptも使用することができます。AJAXは使用せずに実装する方法を提案。
回答を見る
  • ベストアンサー

PHPでファイルのバッチアップロード?

PHP初心者 今制作しているウェブサイトで、バッチアップロード機能(ファイルリスト)を実装したいと思いますが、どうやって実装できますか? 考えたのは、データベースでテンポラリー情報を格納するテーブルを作成することです。ページに二つのフォームを置いて、第一のフォームは一つ一つファイルに関する情報をテーベルに格納し、二つの目フォームが当ユーザーのすべてのファイル情報を出力して「確認」ボタンをクリックすれば実際にアップロードを行います。回りくどい考えかもしれませんが、最もシンプルで標準的な方法があれば、教えていただきたいのです。 PHP/HTML(本当に必要であればJAVASCRIPTもOK)で行いたいのです。AJAXにあまり詳しくないので、今回は使わないで済みたい。 回答を宜しくお願いします。

  • 2B2B
  • お礼率100% (60/60)
  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

もしかして、ファイル名を選択するタグを使って、ファイル名を複数選択させ そのファイル名のリストのみ(ファイルの実体ではなく)をサーバーに送って、 その後、サーバーからクライアントPCのファイルを取り出そうということを 考えているのですか? クライアントPCではFTPサーバーもWebサーバーも起動されてないのですから、 サーバーからクライアントの任意のファイルを逆方向に取り出すことはできませんので この方法(ファイルリスト?)は とれません。 なお、<input type="file" name="~">は ただファイルを選択するためのタグではなく、ファイルのアップロードまで行うタグです。 なので、複数のファイルを一括でアップロードしたいのなら <input type="file" name="~"> のname配列にして複数 書き並べることになります。 http://php.net/manual/ja/feature-fileupload.multiple.php 受け取ったPHPは $_FILES に サーバー上にアップロードされたテンポラリファイル名や元のファイル名などがセットされているので、 あとはこの中身をみて、 テンポラリファイルを適切なディレクトリに移動させればよいだけです。 http://php.net/manual/ja/function.move-uploaded-file.php

2B2B
質問者

お礼

ありがとうございます。ご提案された方法を試してみます。

その他の回答 (3)

回答No.3

>ファイルのアップロード履歴ではなく、アップロードしたいファイルのリスト <input type="file"> でローカルファイルを、指定して、submitボタンを押すと、 ブラウザは勝手にサーバ当てにHTTPリクエストを飛ばします。 つまり、PHP側で受け取っているか受け取っていないかに限らず、ブラウザは、一つファイルを指定してボタンを押す度にサーバにファイルを送ってしまっているので、 「アップロードしたいファイルのリスト」は成り立ちません。 ファイルパスだけ通知して、リストを作って後からアップロードさせる、という仕様は、不可能です。 ファイルを一括指定してアップロードさせるようなものを作成する場合は、FlashやJavaAppletで構築されたプログラムが必要になります。

2B2B
質問者

お礼

ありがとうございます。別の方法を調べてみます。

回答No.2

> 構築しているウェブサイトは、<input type="file" name="~">一つと、ファイルリストを設置する必要があります。 <input type="file" name="~">は 1つのローカルファイル名を指定します。これにより ファイル名もPHPに引き渡しされますが、 「ファイルリスト」って 具体的にはどんな内容ですか? もしかして、過去にアップロードしたファイルも一覧にだしておいて、 アップロードすると、それがどんどん追加されていくということでしょうか? その場合だと、最初は、過去にアップ済みのファイルのみが一覧表示されることになりますが、 <input type="file" name="~">にファイルをセットしてまだsubmitしていないのに 同一画面内の、ファイル一覧にも出したいということであれば、単なるHTMLとPHPではできないので javascriptで動的にファイル一覧にエレメントを追加していくということになります。 >ファイルリストでhidden値にファイルのサーバー上のテンポラリーパス名を入れることは、セキュリティ上で問題にならないかと、心配です。 サーバー上のテンポラリーディレクトリ名はPHPが知っていればよいことなので、 わざわざHidden値にして、クライアントに知らせる必要はありません。 確認処理のPHPにHiddenまたはセッションで渡すなら、パス名なしのユニークファイル名だけでよいです。 もし、アップロード時でなく、アップロード指定画面を表示したときに、すでに ユニークなテンポラリディレクトリを作り直すので次のPHPにそのパス名を知らせたいということであれば、Hiddenに生データを入れないで、セッションでPHP間で引き渡しするなり コネクション毎にID生成して、そのIDにテンポラリディレクトリを紐付けして管理するなりすればよいでしょう。 (なお、単なるエスケープ処理では隠蔽化できません) ただ、結局、1画面構成なら、テンポラリディレクトリはいらないので、いきなり本番ディレクトリに入れてしまえばいいんじゃないですか。

2B2B
質問者

お礼

ありがとうございます。 ファイルのアップロード履歴ではなく、アップロードしたいファイルのリスト。 よく理解できたなら、<input type="file" を置き、その近くに「リストに追加」ボタンを加え、そのボタンがJAVASCRIPT関数を呼び出し、ファイルリストに追加するということですか? もう一つ疑問があるんですが、リストに何を追加すればいいのでしょうか?JavascriptとPHPには、ファイルタイプというタイプがあるんですか?ただリストに文字列であるファイルのパス名を追加するだけでいいんですか?? お手間をおかけしますが、また宜しくお願いします。

回答No.1

<input type="file" name="~"> を使ってローカルからサーバーへファイルをアップロードする場合、 ブラウザによるセキュリティー対策から valueを埋めておくことができません。 (それができると、悪意の第三者が、ローカル上のメールソフトの個人設定ファイルなど  自由に入手できてしまいます) なので、2つのフォーム画面で 最初のフォームではファイル名をセットするだけでアップロードはしないで、 その次の画面のHTMLでtype="file"にvalueをセットしておいて、実際にファイルをアップする ということが できません。 一回でアップロードさせるのがシンプルですが、 構築中のサイトのナビゲーション上 確認画面が必要ということであれば、1画面目で  <input type="file" name="~"> (複数ファイルの場合 nameを変更するか配列にする) でファイル名をセットできるフォームを設置して、それがsubmitすると、その時点で サーバー上にファイルはアップロードされているので、受け取ったPHPは そのファイルを一旦、テンポラリのディレクトリに ユニークなファイル名で確保しておいて、 その後の確認処理では、ファイルのアップロードしないで、サーバー上に確保しておいたファイルを 本番ディレクトリに 移動させるという流れになります。 なお、アップロード→確認 の間のファイル情報の確保は、わざわざそれようにデータベースを作らなくても、セッションやHiddenで充分でしょう。 (格納されたファイルの管理は、別途、必要ですが) それから、アップロードはしたけど、確認はしなかった場合に、テンポラリディレクトリに ゴミファイルがいつまでも残るので、  過去のファイルは、経過時間を見て掃除する処理をPHPに入れておくと よいと思います。

2B2B
質問者

お礼

説明ありがとうございます。 構築しているウェブサイトは、<input type="file" name="~">一つと、ファイルリストを設置する必要があります。ユーザーは<input type="file"を通して一つ一つファイルリストに入れたい項目を選択してから「アップロード」ボタンを押します。 それでフォームを二つにして(同じページで)、フォーム1で<input type="file">を置いて、フォーム2でファイルリストを置くことを考えましたが、ファイルリストでhidden値にファイルのサーバー上のテンポラリーパス名を入れることは、セキュリティ上で問題にならないかと、心配です。 ユーザーがファイルのテンポラリーパス名を知って(ソースコードでhidden値を自由に操れると思います)、危険ですか?そのhidden値にエスケープ処理を行って解決できますか?

関連するQ&A

  • PHPとJavaScriptを使ったファイルアップロードについて

    PHPでファイルアップロードで、サイズオーバーなら、HTML側でJavaScriptを使ってアラートを表示する方法がさっぱりわかりません。どうかアドバイスお願いします。 PHP側でphp.iniに指定しているファイルサイズを越えたならば、 if($_FILES['userfile']['error'] == UPLOAD_ERR_INI_SIZE) とやって、HTML側でJavaScriptを使って、「ファイルサイズオーバー」みたいなアラートを表示する。 というやり方です。 どうぞ宜しくお願いします。

    • 締切済み
    • PHP
  • PHPのファイルアップロード・ダウンロードに関して

    PHPを用いて作成したいプログラムの内容は以下の通りです。 1. htmlフォームよりファイルをアップロード(テキストファイル) 2. アップロードされたファイルの中のデータに対して別のPHPプログラムを実行 3. 2の結果をhtmlにて表示、且つ結果ファイルのダウンロード です。 行き詰まっているのは、htmlから<input type="file">を用いて送信されたファイルはPHPでは$_FILESにそのファイルに関する情報が格納されると思いますが、別のPHPプログラムを実行する際にこのグローバル変数($_FILES)は使用できません。一度、move_uploaded_fileにてどこかのディレクトリに保存したファイルを、fopenなどで読み込んで実行させするしか方法はないでしょうか?すなわち、move_uploaded_fileなしでアップロードファイル内のデータを別のPHPプログラムで実行させる方法はないでしょうか? ダウンロードに関しても同様で、PHPプログラムの実行結果が納められた変数($XXXX)をダウンロードしたい場合、どこかのディレクトリに保存せずにこれをダウンロードさせる方法はないでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • JavaScriptでPHP実行する方法

    質問させて頂きます。 現在、JavaScriptを用いて、DB内に登録されている画像を読み込み(複数の中から1つ)表示させたいと考えています。 JavaScriptを用いて画像を読み込み表示させるといった実装を行ったことが無いので、一般的に行われてる方法を教えて頂けないでしょうか。 私の考えている方法としては、 HTMLファイル上のJavaScriptでajaxというものを用いてPHPを実行させ、PHP上でDBの中から画像情報をランダムでひとつ読み込み、その情報をHTMLにjsonで返して表示させるという方法を使用するべきなのかと考えています。 ですが、ajaxという方法を使用したことが無いため、この方法が正しいのか、他に良い方法があるのではないかと不安になり質問させて頂きました。 もし何か良い方法をご存知の方がいらっしゃいましたら、ご教授お願いいたします。 また、質問に不備な点などあるかもしれませんので、その際はご指摘下さい。 よろしくお願いいたします。

  • javascriptファイルの運用

    お世話になります。 PHP + HTML + javascript(Ajax)で開発しております。 javascriptは外部ファイルにしておりますが HTMLページのダウンロードをユーザーにされると javascriptの内容が分かってしまいます。 ただのHTMLの操作だけだったら構わないのですが ajaxから登録、更新、削除などしておりますので、PHPにどういうパラメータを渡して 、、、という情報が丸見えになるのですが、 こういう場合、皆様はどのように運用しているものなのでしょうか? ご教授宜しくお願い致します。

  • PHPでのファイルアップロードについて

    初めて質問させていただきます。 PHPの勉強をはじめたばかりの初心者です。教本をもとに勉強を進めています。すべて教本どおりに設定し進めてきましたが、ファイルアップロードの箇所でどうしてもうまくいきません。いろいろ、php.iniを修正したり、PHPを修正したりしましたが本どおりの結果になりません。ご指導お願いします。 以下2種類のhtmlファイルとphpファイルを使用 (1)upform.htmlの内容 <HTML><BODY> <FORM METHOD="POST" ENCTYPE="MULTIPART/FORM-DATA" ACTION="upload.php"> <INPUT TYPE="FILE" NAME="upfile"><br> <INPUT TYPE="SUBMIT" VALUE="アップロード"> </FORM> </BODY></HTML> (2)upload.phpの内容 <html><body> <?php if(move_uploaded_file ($_FILES['upfile']['tmp_name'], "./htdocs/phpbook/" ) == FALSE) { print "失敗しました。"; }else{ print ($_FILES['upfile']['name']); print "をアップロードしました。"; } ?> </BODY></HTML> 上記内容でhtmlファイルを呼び出し、abc.txt(デスクトップに保存している)をアップロードしようとすると、以下のエラーが返されます。 ↓↓エラー内容 Warning: move_uploaded_file(./htdocs/phpbook/) [function.move-uploaded-file]: failed to open stream: No such file or directory in C:\Program Files\Apache Group\Apache2\htdocs\phpbook\upload.php on line 7 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\Temp\phpB.tmp' to './htdocs/phpbook/' in C:\Program Files\Apache Group\Apache2\htdocs\phpbook\upload.php on line 7 失敗しました。 ↑↑エラー内容 いろいろ思考錯誤し、upload.phpファイルの6行目"./htdocs/phpbook/"の箇所を、"abc.txt"としてみると、『アップロードしました』とアップロードに成功(?)し、abc.txtはC:\Program Files\Apache Group\Apache2\htdocs\phpbook内にアップロードされました。 教本では、"./htdocs/phpbook/"はファイルの保存先と注記されていますが、エラーになります。"abc.txt"に書き換えることでアップロードに成功しています。また、なぜ、アップロード先がC:\Program Files\Apache Group\Apache2\htdocs\phpbook内になるのかもわかりません。php.iniファイルの設定でしょうか。質問が長くなり、また、内容に足りない面もあるかもしれないですが、どうかよろしくお願いします。 【参考】 php.iniのFile Uploadsを抜きました。 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. file_uploads = On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). upload_tmp_dir = ; Maximum allowed size for uploaded files. upload_max_filesize = 2M

    • ベストアンサー
    • PHP
  • データベースにアクセスするWebページ

    どちらに質問してよいかわからずこちらに質問させていただきます。 私が担当しているのは、既に公開されているWebページの変更です。 写真や文字列など、変更があるたびにHTMLファイルを開いて 手作業で更新作業をしているところに、データベースにアクセスして データベースの情報を表示するように変更することになりました。(←ここが私の担当です) ※既存のWebページは私が制作したものではありません。 「困っているのは既存のWebページへの実装方法」で、 既に試した方法は 1. データベースの情報を表示する箇所を、まるまる   別HTMLで作成し、JavaScriptでajax通信にて動的に項目を作成するページをつくって   IFRAMEにて既存のページに埋め込む方法をしてみました。   見事動作したのですがこれには問題点がありました。   それは私が実装したIFRAMEの中のHTMLは、JavaScriptが読めない人には   扱えないということでした。   また、JavaScriptだけでなく、CSSも既存ページに合わせて作り直す必要もあり、   他のページに同じようにデータベースの内容を表示して!と言われたら大変な手間がかかります。 2. 既存のHTMLファイルにオリジナルのスクリプトを埋め込む方法。   たとえば<span>#todays_news;</span>のような感じです。      この方法で記述して、http://xxx.jp/解析.php?url=HTMLファイル   にアクセスすると解析.phpがオリジナルスクリプトの埋め込まれたHTMLファイル内の   スクリプトを、データベースから取得したデータに置き換えて出力します。   これの問題点は   サイトのindexからリンクをクリックしてもらえれば解析.phpを通して   データベースの内容で置き換えたページが出力されますが、   直接、HTMLファイルへアクセスされるとオリジナルスクリプトが丸見えになってしまいます。   またSEO対策で不利になるのではと考えています。 そこで、データベースの内容を変更すると、すべてのHTMLファイルを解析.phpに通して出力してしまおう、という考えです。しかしこれだとデータベースの内容を変更するたびすべてのHTMLを書き換えることになり、なんとも効率的ではない気がするのです。 データベースの内容を表示するのに、 HTMLをロードしてからJavaScriptにて動的にコンテンツを生成するのか、 なにかしらの方法で、データベースの内容を反映させたHTMLファイル(静的)を置くのか はたまた、違う方法なのか、 とーっても悩んでおります;;;;;;;; 職場にはJavaScriptやPHP,MySQL等を理解しているものはおらず、 だれにも聞けなくてここで質問させていただきました。 どうかアドバイスお願いいたします><。

  • ファイルのアップロード

    現在下記のような処理を行なおうとしております。 a.php > 入力ページ アップロードするファイルを選択します。 b.php > 確認ページ アップロードするファイルのファイル名を表示します。 c.php > アップロードページ a.phpで選択したファイルをアップロードします。 move_uploaded_fileで実現しようと思っているのですが、b.php → c.phpの タイミングでa.phpで選択したファイルがテンポラリディレクトリから 削除されてしまうため、c.phpでアップロード処理が行なえません。 入力 → 確認 → アップロード といった順で処理を行なう場合、どのような方法を採るのが良いでしょうか。 ヒントでもよいので教えて頂ければと思います。

    • ベストアンサー
    • PHP
  • phpでアップロードしたファイルを変数に直接受け取る方法

    phpでアップロードしたファイルをテンポラリファイルに保存せず、直接変数に直接受け取りたいと思っております。 putメソッドというのがあるようなのですが、これは少しレアな気がしており、postで対応可能であればそうしたいと思っております。 PHP マニュアル 第38章 ファイルアップロードの処理 http://www.php.net/manual/ja/features.file-upload.php http://www.php.net/manual/ja/features.file-upload.put-method.php

    • ベストアンサー
    • PHP
  • ファイルアップロード時のファイル選択画面の初期パスを設定しない

    phpとjavascriptを使ってファイルをアップロードのフォームを 作っている初心者です。 ファイルアップロードフォームの参照ボタンを押して ファイル選択ダイアログを出した時に、初期パスを固定にしたいので、 方法があるのでしょうか?

    • 締切済み
    • PHP
  • 【PHP】tmp_nameの命名規約について

    PHPアプリケーション上でファイルをアップロードすると、$_FILESにいくつか情報が格納されます。 その中の一つ["tmp_name"]にはテンポラリファイル名(デフォルトだと/tmp/XXXXX...でしょうか)が 格納されていますが、このテンポラリファイル名の「命名規約」について、解説のページ・書籍等はないのでしょうか? いろいろ見ているとファイル名の先頭は「php」であったり、大小英数字がランダムで設定されていたりしていることは見て取れたのですが、バラバラで規則じみていなかったもので...。 こんな質問で恐縮なのですがご存知の方いらっしゃいましたら、ご回答のほどお願いいたします。

    • 締切済み
    • PHP