• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPのファイルアップロード・ダウンロードに関して)

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

このQ&Aのポイント
  • PHPを使用してファイルのアップロードとダウンロードを行う方法についてご質問です。
  • HTMLのフォームからファイルをアップロードし、別のPHPプログラムで処理する方法をご教示いただきたいです。
  • また、ファイルのダウンロード時に一時的に保存せずに直接ダウンロードさせる方法も知りたいです。

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

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

処理内容が明確でないため、要件が良く分かりません。 フォームからアップロードしたデータは、そのフォームのaction先のPHPで処理をするのではダメなのでしょうか。 また、別のPHPプログラムというのは、どの様に実行するのでしょうか。 ■execやsystem関数を使って、コマンドラインから実行する場合 move_uploaded_file関数を使って規定のディレクトリに収めるしか無いです。 処理が終わったら、unlink関数でファイルを削除してしまえばいいような気はします。 ■WebアプリケーションとしてPHPプログラムを実行する場合 アップロード画面から内容確認してリダイレクト処理をし、プログラムを実行する、ということであれば、 セッションを使っては如何でしょうか。 ●フォームプログラム側 <?php session_start(); $tmp_name = $_FILES['upload']['tmp_name']; //ここに一度アップロードされたテキストがテンポラリとして保存されていると思います。 $text = file_get_contents($tmp_name); //保存されたものを直接受け取ります。 $_SESSION['uploaded_text'] = $text; //セッションに格納。 header('Location: next.php'); //実行したいプログラムへリダイレクト ?> ●処理プログラム側 <?php session_start(); $text = $_SESSION['uploaded_text']; //フォームから渡されていると思います。 $text = execute($text); //処理を実行 $_SESSION['replaced_text'] = $text; //処理済みのファイルを別変数なりに格納。 echo $text; ?><a href="download.php">処理結果をダウンロード</a> ●ダウンロードプログラム <?php session_start(); $text = $_SESSION['replaced_text']; header('Content-Type: application/octet-stream'); //バイナリデータであると偽装することで以下echoした内容は、ダウンロードダイアログが表示される。 echo $text; ?> といった感じでしょうか。

stkkmo
質問者

お礼

ご回答ありがとうございました。 こちらの知識不足のため、質問の内容が不明確で申し訳ありませんでした。 別のPHPプログラムとはexec関数を用いて外部プログラム(他言語)を呼んで処理させるプログラムのことです。 その場合はmove_uploaded_file関数を使って規定のディレクトリに収めるしか無いんですね。 sessionに関しては勉強不足なのですが、外部の他言語プログラムを用いる場合はやはりそのプログラムも認識できるよう共通のファイルを生成するしかないのでしょうか…?

その他の回答 (1)

回答No.2

>外部の他言語プログラムを用いる場合はやはりそのプログラムも認識できるよう共通のファイルを生成するしかないのでしょうか…? 無いです。 外部プログラムであればメモリを共有しているわけでもないので、何らかしらのストレージに吐き出す意外に方法はないと思います。 一度テンポラリーディレクトリのような場所に格納して、処理が終わったらすぐに削除するとか、 cronなどを用いて一定時間に一度古いファイルを削除するとか、そういう対応を行う必要があると思います。 前回回答でご案内させていただいたセッションに関しても、アクセスした人毎に衝突しない単一IDを付与して、Cookieに与え、サーバ上には、テンポラリーディレクトリにシリアライズしたデータを格納して、PHP側で一定期間に一度、左記で書いたファイルを古いものから削除していく、という対応をある程度自動化しただけなので、大体似たような実装です。

stkkmo
質問者

お礼

hogehoge78様 詳しいご説明ありがとうございました。 はやり一度外部ファイルに出力する方法以外ないのですね。 それを基にプログラムを構築してみます。 ありがとうございました。