• ベストアンサー

ファイルのアップロード方法(Perl)

<INPUT TYPE="file">で指定されたファイルをサーバーにアップロードする方法をさがしています。 CGIの記述言語はPerl、転送を行うファイルは画像ファイルです。 送られてきたデータを確認したところユーザー側のファイルへのフルパスなのは確認できましたが、そこからアップロードする方法が分かりません。 パールライブラリ(.plか.pm)でファイル転送を行う良いライブラリがあれば教えてください。 また、転送の方法を教えてください。

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

>1, >-----------------------------7d431c1420724 >この文字列は何を表しているのでしょうか? formタグでenctype="multipart/form-data"と指定しているので送信データはマルチパートになります。 「-----------------------------7d431c1420724」はパートの区切りを表すバウンダリ文字列です。 >2, >jpegなどの画像を送信したときには、バイナリデータが送られてきました。それをそのまま保存すれば元の画像になるのでしょうか? そうです。 >3, >type="text"も同時に送信してみましたが、通常と違い、%nnにエンコードされずに日本語がそのまま送信されてきました。 >これを通常の%nnで送信されるようにするのは不可能なのでしょうか? Perlの知識に乏しいので%nnというのがわからないのですが、マルチパート指定で送信するデータをエンコードするのはできないように思います。 ANo.1の回答でも書きましたが、詳細については自分で調べることをお勧めします。

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

cgi-lib.pl を使えば、あまり悩むことなく取得出来るでしょう。 cgi-lib.plでは、送信量制限があり、2^17=131072以内です。 cgi-lib.plが読めれば、自分でこの制限を書き換えることは可能です。 受け取りコードは、 &ReadParse(); ### %in=data; %incfn=filename; %inct=filetype $filetype =$inct{'file_tag_name'}; $filename =$incfn{'file_tag_name'}; $filedata= $in{'file_tag_name'};

参考URL:
http://cgi-lib.berkeley.edu/
shirousa01
質問者

お礼

回答ありがとうございます。 ファイルのUpは、標準モジュールである、CGI.pmを使用する事にしました。 cgi-lib.plはライブラリであるため、危険性があるとの記述を発見しましたし、それにPerlではモジュールの使用を推奨しているためです。 ファイルのUpや、値の操作をしてくれるライブラリがあることを教えてくれたことに感謝します。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

たぶんformのenctypeを指定していないと思うのでmultipart/form-dataを指定 してください。ファイルデータがサーバに送られるようになるはずです。 <form action="hoge.cgi" method="post" enctype="multipart/form-data"> <input type="file"> </form> Perlでの処理は自分で検索してください。ありふれた処理なのでサンプルコードは すぐに見つかるはずです。

shirousa01
質問者

補足

いままでは、 read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); で、読み込んでいたのですが、これだと読み込めたデータは -----------------------------7d431c1420724 になりました。 そこで、perlの%requestから判断して while(<STDIN>){$str .= $_;} に変更したところ、 -----------------------------7d431c1420724 Content-Disposition: form-data; name="filedata"; filename="C:\Documents and Settings\subject\My Documents\text\test1.txt" Content-Type: text/plain This is test data. [crlf]format is text テストです。 ここに改行があります。 -----------------------------7d431c1420724 Content-Disposition: form-data; name="chtext" test日本語 -----------------------------7d431c1420724-- このようになりました。 補足要求ですが、 1, -----------------------------7d431c1420724 この文字列は何を表しているのでしょうか? 2, jpegなどの画像を送信したときには、バイナリデータが送られてきました。それをそのまま保存すれば元の画像になるのでしょうか? 3, type="text"も同時に送信してみましたが、通常と違い、%nnにエンコードされずに日本語がそのまま送信されてきました。 これを通常の%nnで送信されるようにするのは不可能なのでしょうか?

関連するQ&A

  • Perlのファイルのアップロードの方法についてお聞きします。

    Perlのファイルのアップロードの方法についてお聞きします。 &ReadParseを用いた方法で、 $file = $in{'TENSOU'};で$file自体にデータが入るので 簡単だなと思っていましたが、送信元と送信後のファイルが若干違っていました。 使い方が間違っているのでしょうか? 以下、サンプル ◆HTML側 <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"><P> ファイル: <INPUT TYPE="file" NAME="TENSOU" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> ◆Perl側 &ReadParseの例を用いた方法 #!/perl/bin/perl #!/usr/local/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); #--->エラー対策 require 'cgi-lib.pl'; require 'jcode.pl'; $BUFSIZE = 2048; &ReadParse; # ==> 強力な変換 $file = $in{'TENSOU'}; # ==> 実態自体がデータなので、取り扱いしやすい $file_size = length($file); $file_size *= ($BUFSIZE / 1024); open(OUT, "> test.jpg"); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "$file_size(KB)<br>\n"; print "<a href=\"test.jpg\">テスト</a>\n"; exit;

    • ベストアンサー
    • CGI
  • ファイルの転送。

    <Form>内、<Input type="file">タグにてファイルを転送し。それをPerlで受け取って、保存しようと思っています。保存する主なファイルは画像ファイルです。 前に立てたレスにて、cgi-lib.plを使用すると楽との指摘を受けました。 こちらでいろいろ調べてみましたが、ファイル転送を日本語で解説しているページが見つかりません。 参考にしたページはこちらです。 http://www.futomi.com/lecture/form/cgilib.html これだと<Input type="text">などの内容の取得方法はわかりますが。<Input type="file">の内容の取得方法がわからないのです。 残念なことなのですが、cgi-lib.plのソースコードに記載されている解説を見ても、私がまったく英語が読めない故に使用方法は分かりませんでした。 そこで、chi-lib.plでのファイルの内容を保存するまでの解説つきサンプルコード・cgi-lib.plでのファイルの転送を解説している日本語のページどちらかを教えていただきたく思います。 また、cgi-lib.plと比較し、CGI.pmも同等の機能を保有しているように見て取れるのですが、やはりperlの推奨している通り.plより.pmを使用したほうがよいのでしょうか? 分かる方がいらっしゃいましたら、この辺りのことについても教えていただきたく思います。 なにぶん、ファイル転送は初の試みゆえにいろいろと覚えることが多く大変です。分かりやすい解説をお願いします。

    • ベストアンサー
    • Perl
  • Perlでファイルをアップロードしたい

    えーPerlを使用してローカルからサーバーへFTPを使わず、かつパスを指定してファイル(CSV)をアップロードさせたいのですが、フォームの<input type="file"...>ではファイルを参照ボタンで指定せなだめなため使いたくないのです。一瞬フォームから<input type="hidden">を使用してファイルの中身をデータにして送りサーバでファイルを作ろうかとも考えたのですがサーバ側に負担がかかりそうで・・・教えてください。お願いします。

  • Perlでファイルをアップロードさせたい

    えーPerlを使用してローカルからサーバーへFTPを使わず、かつパスを指定してファイル(CSV)をアップロードさせたいのですが、フォームの<input type="file"...>ではファイルを参照ボタンで指定せなだめなため使いたくないのです。一瞬フォームから<input type="hidden">を使用してファイルの中身をデータにして送りサーバでファイルを作ろうかとも考えたのですがサーバ側に負担がかかりそうで・・・教えてください。お願いします。

    • 締切済み
    • CGI
  • perlでCSV形式ファイルのアップロード方法

    perlでCSV形式ファイルのアップロード方法を教えてさい。 htmlで <HTML> <BODY> <FORM action="excel読み込み.cgi" enctype="multipart/form-data" method="post"> フレアシステムのファイル: <INPUT type="file" name="upload_file" size="60"><BR> <INPUT type="submit" value="読み込み"> </FORM> </BODY> </HTML> として、ファイル名の指定をして、読み込みボタンを押すと、excel読み込み.cgiを呼び出すのですが、プログラムの内容が表示されるだけで終わってしまいます。 excel読み込み.cgiのプログラムは以下の内容です。 #! c:/perl/bin/perl use CGI; $query = new CGI; $filename = $query->param('upload_file'); while(read($filename, $buffer, 2048)) { $file .= $buffer; } @files = split(/\\/, $filename); ($basename, $exp) = split(/\./, $files[-1]); $new_file = $basename . "." . $exp; # ファイルを指定ディレクトリにコピー #open(OUT, "> c:\\foo\\$new_file"); open(OUT, "> c:\\$new_file"); binmode(OUT); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "[$basename] [$exp]\n"; print "正常終了\n"; exit; CGIのプログラムを色々と調べて、別のないようにしても同じようにプログラムがそのまま表示されてしまいます。 どなたか教えてください。 宜しくお願いします。

  • ReadParseを使ってのバイナリファイルのアップロード

    ファイルをアップロードするCGIを作ろうと思い、以下のように書いてみました。そうしたところテキストファイルのアップロードには成功しましたが、バイナリファイルだとアップロード出来ても開けなかったり、画像が崩れてしまったりしてしまいました。 何故バイナリファイルだとアップロードが失敗してしまうのかわかりません。どこを直せば良いのでしょうか。 よろしくお願いします。 ----------------------------------------------- フォーム <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="xxx.pl"> <INPUT TYPE="file" NAME="file"> <INPUT TYPE="submit" VALUE="アップロード"> </FORM> ------------------------------------------------ xxx.pl &ReadParse(*in, *f_name, *f_type); $f_name{'file'}=~/([^\\\/]+)$/; $filename = $1; open(IN, ">$filename"); print IN $in{'file'}; close(IN);

    • ベストアンサー
    • CGI
  • Perlで複数ファイルをアップロードする方法?

    Perlで複数ファイルをアップロードする方法? Perl勉強中の初心者です。 掲示板などで、フォルダ内にある複数ファイルを一度に ファイルアップロードする方法はどうやるのでしょうか? 一番は、サンプルプログラムがあれば、教えてほしいです。 また他の言語で可能なら、その方法論を知りたいです。 それを元にPerlで実現できないか検討したく。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • フォームでの、巨大ファイルデータのアップロード

    form input type="file" を使ってファイルデータをアップロードし、perl の標準入力からデータを取得します。 この時、約30メガくらいまでなら正常に取得可能ですが、それ以上になると、CGI側でエラーが出ます。このことについてサーバー業者に問合せをしたところ、 「CGIの動作時間が長くかかる場合、該当のスクリプトの動作が負荷軽減のため、仕様により中断される場合がございます。」という解答でした。 大きなファイルを転送する方法が不明です。 どなたかご回答をお願いできますでしょうか。 宜しくお願い致します。

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

    ファイルのアップロードでCGI::Liteを使っています。 PerlはActivePerlのバージョン5.8ですが アップロード先のデータの中身が変わってしまい、 画像データなのに別のファイルになって表示されなくなりました。 これはファイル自体の文字コード変換が絡んでいるということですか? また、CGIとCGI::Liteの違いですが、両方使ってもよいのでしょうか?

    • ベストアンサー
    • Perl
  • アップロードされてきた画像ファイル

    フォームからアップロードされてきた画像ファイルを、適当なファイル名を付けてJPGあるいはGIFの拡張子で保存し、HTMLファイルで保存した画像を一覧表示させようというCGIスクリプトを作りたいと考えています。 <FORM action="xxxx.cgi" method="post" enctype="multipart/form-data"> <INPUT type="file" name="gazo"> <INPUT type="submit"> </FORM> とこんな具合のフォームから画像ファイル(JPGやGIF)をアップロードした時、 受け手のxxxx.cgiでは、この画像ファイルのデータをどのように受けたらよいのでしょうか? cgi-lib.plを読み込んで、$in{'gazo'} というような形で画像ファイルのデータを受け取ればよいのでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう