下のようなフォームを使ってファイルをアップロードする処理をしてみます。
フォームのソースは以下のようになっています。
画像などのデータを送る場合エンコードのタイプを enctype="multipart/form-data" として下さい。
メソッドはPOST、送信先はサンプルスクリプトとし、ファイル入力フォームの
name をサンプルでは
upfile としています。
この名前は、書き込み処理の部分で使う連想配列の名前となりますので、覚えておいて下さい。
【処理の流れ】
&ReadParse; を使うと、送信されたフォームデータを連想配列に入れてくれます。
引数無しで実行すると $in{'要素名'} に値が格納され、配列全体は @in で参照できます。
以下のサンプルソースでは ファイルの送信フォームの名前が upfile としていますので、
$in{'upfile'} に送信する画像データが入っています。
【参考】ReadParse で受け取りデータを連想配列に入れる
受信データが入った @in にはコンテンツタイプや、元のファイル名などが入っており、そこを
参照して受信したデータの拡張子を取出します。
中間の処理を飛ばし、受け取ったデータ @in をそのまま画面表示すると、どのようなデータ
が入っているかがわかると思います。
Content-type〜 に続く mime-type もしくは filename= の部分に入っている元のファイル名
などを探して拡張子を取出す作業をし、許可したいデータ以外が送信されていた場合は、その
後の書き込み処理を行わず、最後にエラーを表示します。
最後にファイルの書き出しを行いますが open OUT,">$fnme"; の
$fnme 部分では拡張子
を含めたファイル名を指定し binmode OUT; の部分ではバイナリモードで扱う事を指定して
いますが、これを指定しなかった場合、転送時に画像をテキストモードで送ってしまった場合
のように画像が壊れる事がありますので(改行コード変換により)テキスト以外ではこれを指定
して下さい。
print OUT $in{'upfile'}; ではファイルの書き出しを行っていますが $in{'upfile'} にフォームから
受信した画像が入っています。
$in{'upfile'} としているのはファイルの入力フォームの名前を upfile としているからで、別の
名前を付けた場合は $in{'名前'} を使って書き込みを行います。
【サンプルソース】
上記の説明とサンプルソースを見比べながら、処理の流れを確認して下さい。
|