- ベストアンサー
PHPでファイルのバッチアップロードの実装方法
- PHP初心者による、ウェブサイトでのバッチアップロード機能の実装方法について。
- テンポラリー情報を格納するテーブルを作成し、フォームを用いてファイル情報を格納する方法と、全てのファイル情報を確認してアップロードする方法について説明。
- PHPとHTMLを使用し、必要に応じてJavaScriptも使用することができます。AJAXは使用せずに実装する方法を提案。
- みんなの回答 (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
その他の回答 (3)
- hogehoge78
- ベストアンサー率80% (433/539)
>ファイルのアップロード履歴ではなく、アップロードしたいファイルのリスト <input type="file"> でローカルファイルを、指定して、submitボタンを押すと、 ブラウザは勝手にサーバ当てにHTTPリクエストを飛ばします。 つまり、PHP側で受け取っているか受け取っていないかに限らず、ブラウザは、一つファイルを指定してボタンを押す度にサーバにファイルを送ってしまっているので、 「アップロードしたいファイルのリスト」は成り立ちません。 ファイルパスだけ通知して、リストを作って後からアップロードさせる、という仕様は、不可能です。 ファイルを一括指定してアップロードさせるようなものを作成する場合は、FlashやJavaAppletで構築されたプログラムが必要になります。
お礼
ありがとうございます。別の方法を調べてみます。
- superside0
- ベストアンサー率64% (463/719)
> 構築しているウェブサイトは、<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画面構成なら、テンポラリディレクトリはいらないので、いきなり本番ディレクトリに入れてしまえばいいんじゃないですか。
お礼
ありがとうございます。 ファイルのアップロード履歴ではなく、アップロードしたいファイルのリスト。 よく理解できたなら、<input type="file" を置き、その近くに「リストに追加」ボタンを加え、そのボタンがJAVASCRIPT関数を呼び出し、ファイルリストに追加するということですか? もう一つ疑問があるんですが、リストに何を追加すればいいのでしょうか?JavascriptとPHPには、ファイルタイプというタイプがあるんですか?ただリストに文字列であるファイルのパス名を追加するだけでいいんですか?? お手間をおかけしますが、また宜しくお願いします。
- superside0
- ベストアンサー率64% (463/719)
<input type="file" name="~"> を使ってローカルからサーバーへファイルをアップロードする場合、 ブラウザによるセキュリティー対策から valueを埋めておくことができません。 (それができると、悪意の第三者が、ローカル上のメールソフトの個人設定ファイルなど 自由に入手できてしまいます) なので、2つのフォーム画面で 最初のフォームではファイル名をセットするだけでアップロードはしないで、 その次の画面のHTMLでtype="file"にvalueをセットしておいて、実際にファイルをアップする ということが できません。 一回でアップロードさせるのがシンプルですが、 構築中のサイトのナビゲーション上 確認画面が必要ということであれば、1画面目で <input type="file" name="~"> (複数ファイルの場合 nameを変更するか配列にする) でファイル名をセットできるフォームを設置して、それがsubmitすると、その時点で サーバー上にファイルはアップロードされているので、受け取ったPHPは そのファイルを一旦、テンポラリのディレクトリに ユニークなファイル名で確保しておいて、 その後の確認処理では、ファイルのアップロードしないで、サーバー上に確保しておいたファイルを 本番ディレクトリに 移動させるという流れになります。 なお、アップロード→確認 の間のファイル情報の確保は、わざわざそれようにデータベースを作らなくても、セッションやHiddenで充分でしょう。 (格納されたファイルの管理は、別途、必要ですが) それから、アップロードはしたけど、確認はしなかった場合に、テンポラリディレクトリに ゴミファイルがいつまでも残るので、 過去のファイルは、経過時間を見て掃除する処理をPHPに入れておくと よいと思います。
お礼
説明ありがとうございます。 構築しているウェブサイトは、<input type="file" name="~">一つと、ファイルリストを設置する必要があります。ユーザーは<input type="file"を通して一つ一つファイルリストに入れたい項目を選択してから「アップロード」ボタンを押します。 それでフォームを二つにして(同じページで)、フォーム1で<input type="file">を置いて、フォーム2でファイルリストを置くことを考えましたが、ファイルリストでhidden値にファイルのサーバー上のテンポラリーパス名を入れることは、セキュリティ上で問題にならないかと、心配です。 ユーザーがファイルのテンポラリーパス名を知って(ソースコードでhidden値を自由に操れると思います)、危険ですか?そのhidden値にエスケープ処理を行って解決できますか?
お礼
ありがとうございます。ご提案された方法を試してみます。