AN HTTPD ゲストブック/コメント集(2000年5月16日14:57)


中田昭雄 nakata@st.rim.or.jp 2000/05/21 17:23

佐川さん、
なるほど。どうもありがとうございます。
そうすると、ACTIONで phpファイルを指定したらその中で $userfile などはそのまま参照できるわけですね。

ユーザ会へのリンクは加えておきました。


佐川 昭宏 sagawa@kamakuranet.ne.jp 2000/05/20 21:57

>IGRO'Sさん
PHP 3.0.14(ちょっと古い)を用いて、ファイルアップロード処理を行ってみました。
使用したPHPスクリプトは以下の通りです。
(サンプルとほとんど同じです。)

<HTML>
<BODY>
<FORM ENCTYPE=”multipart/form-data” METHOD=POST>
<INPUT TYPE=”hidden” name=”MAX_FILE_SIZE” value=”1000”>
Send this file: <INPUT NAME=”userfile” TYPE=”file”>
<INPUT TYPE=”submit” VALUE=”Send File”>
</FORM>
<?php
printf ( ”Temp File : %s<BR>\n”, $userfile);
printf ( ”File Name : %s<BR>\n”, $userfile_name);
printf ( ”File Type : %s<BR>\n”, $userfile_type);
printf ( ”File Size : %s<BR>\n”, $userfile_size);
?>
</BODY>

結果、ちゃんと送信できました。
(ただし、ファイルサイズが *1Kバイト以下* の場合)
# MAX_FILE_SIZEの値を大きくしたらどうなりますか?
日本語のファイル名では切り出しに失敗することがあるので、
日本語をファイル名に使わないようにして、
国際化版(日本語版)が、使えるのであればそちらを使うようにしましょう。
# PHP3.0.15-i18nのWindowsバイナリは今のところ、作成されていませんが。(^^;;

また、アップロードされたファイルは、
スクリプト実行後に消されるので、必要に応じてコピーする必要があります。

>中田さん
このように、PHPでは、ファイルのアップロードもすべてPHP内部で行ってしまいます。
ユーザ側は意識する必要はありません。
ですから処理を行う関数も、PHPのソースになります。

ついでで申し訳ないのですが、
リンクにPHPユーザ会のページを加えてくださるようお願いいたします。

では。


中田昭雄 nakata@st.rim.or.jp 2000/05/18 21:23

IGRO'S さん、
FORMの方はCGIでアップロードする時の標準的な内容ですね。 
_URL_ で指定した PHPファイル の中身を教えてください。 multipart の内容を受けて処理する関数が記述されるのだと思うのですが。。。
違うのかもしれませんけど、ちょっと時間がとれなくて PHPのドキュメントをまだ見ていません。


IGRO'S igros@d1.dion.ne.jp 2000/05/18 18:06

>中田昭雄 nakata@st.rim.or.jp 2000/05/16 21:20
>IGRO'S さん、
>私はPHPでのファイルアップロードはやってみたことがないので「戻り値」というのがわかりません。
>PHPの記述をどういうふうにした場合の話でしょうか?
中田さん、こんにちわ。
上の質問を投げたIGRO'Sです。
PHP3のリファレンスによれば、

ここから ↓
PHP は、全ての RFC1867 対応ブラウザ(Netscape Navigator 3 以上、 Microsoft からのパッチをあてた Microsoft Internet Explorer 3 またはパッチ無しのそれ以降の版を含みます)からファイルアップロードを 受けることができます。 この機能では、テキストとバイナリファイルの両方のアップロードが可能です。 PHP の認証関数およびファイル操作関数を用いて、アップロードを許可するユーザと アップロード後にそのファイルを使用して行う動作を完全に制御することが 可能です。
ファイルアップロード画面は、次のような特別なフォームを作成することにより、 作成することができます。
例 18-1. ファイルアップロード用のフォーム
FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST
INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000"
Send this file: <INPUT NAME="userfile" TYPE="file">
INPUT TYPE="submit" VALUE="Send File"
/FORM

_URL_ はPHPファイルを指す必要があります。MAX_FILE_SIZE hidden フィールド MAX_FILE_SIZEは、入力フィールド file の前に置く必要があります。 この値は、取得可能なファイルの最大サイズを規定します。 この値はバイト数で指定します。 アップロードに成功した場合、(URLで指定した)送信先ファイルで 次の変数が設定されます。

$userfile - サーバマシンにアップロードされたファイルが 保存されているテンポラリファイルの名前
$userfile_name - 送信元のシステムにおけるオリジナルのファイル名
$userfile_size - アップロードされたファイルのサイズ(バイト数)
$userfile_type - ファイルの MIME 型。ただし、ブラウザがこの情報を提供した場合のみ。例えば、"image/gif".のようになります。

上記の変数のうち、"$userfile" は、 アップロード用フォーム中の TYPE=file を有する INPUT フィールドの NAME フィールドの値とは関連がないことに注意して下さい。 上のアップロード用フォームの例においては、その NAME フィールドの値を "userfile" としています。
ファイルは、デフォルトでサーバにおけるデフォルトの テンポラリディレクトリに保存されます。 このディレクトリは、PHP を実行する環境において環境変数 TMPDIR を設定することにより変更することができます。 しかし、PHP スクリプトの内部から putenv 関数により 設定しても上手くいきません。
ここまで ↑

となっているので、単純に$userfilexxを echo(print)して確認していますが、
NULLのようです。


中田昭雄 nakata@st.rim.or.jp 2000/05/16 21:20

IGRO'S さん、
私は PHPでのファイルアップロードはやってみたことがないので「戻り値」というのがわかりません。
PHPの記述をどういうふうにした場合の話でしょうか?


IGRO'S igros@d1.dion.ne.jp 2000/05/16 14:57

はじめまして、中田さん
ハンドルネーム IGRO'S と言います。
随分前から AN HTTPDにお世話になってます。
最近、PHP3とMySQLを組み込み、色々とデバッグしているのですが、
PHP3が提供する、画像ファイルのアップロードですが、
うまく戻り値が返ってきません。(当然、ファイルもテンポラリにアップされていないよう)
AN HTTPでは、対応していますか?
どこかに設定方法があるでしょうか?
ご教示頂ければ幸いです。

(それともPHP3自身の問題なのでしょうか???)