|
いつもお世話になります。 CGI.pm でファイルのアップロードをするときの質問です。 html で <html> <body> <pre> アップロードするファイルを指定してください。 ファイル名は半角英数字で、空白を含まないでください。 </pre> <form action="fileup.cgi" method="POST" ENCTYPE="multipart/form-data"> ファイル名:<input type="file" name="fname"><br> <hr> <input type="submit" value="OK"> </form> </body> </html> というフォームを作って、 #! perl -w # fileup.cgi use CGI; my($form) = new CGI; print $form->header("text/html"); my($filename) = $form->param('fname'); $filename =~ m|([^\\]+)$|; # Windows のフルパスから基底ファイル名を取り出す $newfile = "./gooddir/$1"; # gooddir の下に入れる。 open (OUTFILE,">$newfile") or die "Can't make serverside file because $!\n"; while ($bytesread = read($filename,$buffer,1024)) { print OUTFILE $buffer; } print <<EOD; <pre> アップロードが終了しました。ファイル「$filename」は $newfile としてアップロードされました。 </pre> EOD という CGI を呼び出すとうまくいくのですが、 同じ CGI を、呼び出し側のフォームも CGI.pm で作って #! perl -w use CGI; use strict; my $title = 'ファイルをアップロードしてください'; my $q = new CGI; print $q->header(); print $q->start_html(); print $q->start_form(-method=>'form', -action=>'./fileup2.cgi', -enqtype=>'multipart/form-data'); print $q->h2($title); print '変換するファイルを指定し、[実行] をクリックしてください。<br>', '(空白のあるファイル名、日本語のファイル名は避けてください)<br>', $q->filefield(-name=>"fname"), '<br>'x3; print $q->submit(-name=>'submit',-value=>'実行'); print $q->endform; print $q->end_html(); とやると、空ファイルが作成されるだけでうまくアップロードできません。 エラーログには何も出ません。 なにがおかしいのでしょうか? 何かおわかりでしたらご教示願います。 |
|
ん〜、 >>2403 ふくし > -method=>'form' post? > -enqtype=>'multipart/form-data' enctype? とか? |
|
>>2404 68user さん、本年もよろしくお願いします。 ん〜、ほんとにそれだけのことでした。;;; 恥の掻き初め(寒)ですね。 最初、-enctype を指定していなかったんです。 そうすると start_form がデフォルトで application/x-www-form-urlencoded を取るので 失敗していたようです。 (その場合 start_multipart_form を使えばデフォルトが multipart/form-data になるようですね) method も post がデフォルトなので書いていなかったのですが、 html と最大限あわせようと思って質問の直前に書いて、 それで失敗していたのでした。 ハッシュによる名前付け編集の渡しは、 存在しないキーを渡しても無視されるのはなんかわかりますけど、 存在するキーに定義されてない値を渡しても怒られないのは ちょっと CGI.pm が不便だなあと思いました。 いずれにしても、これらのケースでエラーを出して欲しいです。 (出す方法あったりして、、) とまれ、ありがとうございました&すいませんでした。 本年もよろしくです。 |
|
proxy サーバに接続後、 strcpy(request, "CONNECT www2.ggn.net:443 HTTP/1.1\r\n" "Host: www2.ggn.net\r\n" "\r\n"); write(s, request, strlen(request)); とする。そしたら proxy サーバが HTTP/1.0 200 Connection established(CRLF) (CRLF) などと返してくるので、 read_size = read(s, buf, BUF_LEN); write(1, buf, read_size); でレスポンスを読み取る (↑これは手抜き)。その後は SSL_load_error_strings(); して、普通におはなし。 >>2160 Nira では ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); を追加する必要がある、ということでしたが、FreeBSD 4.4-RELEASE では 付けても付けなくてもうまくいきました。 お仕事では、Windows+Borland C++ Builder 5.0 でやらなきゃ いけないのが欝です (C++ 知らんし、Windows でプログラムを 組んだことがないし)。HTTP 用モジュールは用意してあるみたい だけれど、使い方がさっぱりわからんなぁ。 >>2405 ふくし > 存在するキーに定義されてない値を渡しても怒られないのは > ちょっと CGI.pm が不便だなあと思いました。 perl 5.005_03 付属の CGI.pm を見る限りでは、エラー検出する 方法はないようですね。 > 本年もよろしくです。 こちらこそよろしくお願いします。 |
|
>>2406 68user う、一行目が欠けてしまって意味不明に。 一行目は 「お仕事で proxy サーバ経由の SSL 通信を行う必要があったので、メモメモ。」 でした。 |
|
UNIXを勉強したい人ってはじめは何をすれば良いか教えてください! ほんとにくだらない質問をしてすいませんが、おねがいします!! |
|
>>2394 Ka23 > UNIX プログラミング FAQが以下に移転しています。 遅くなりましたが反映しました。ありがとうございました。 >>2408 ぶちお > UNIXを勉強したい人ってはじめは何をすれば良いか教えてください! 本屋に行ってインストール記事の載っている雑誌か、 インストール本を買うか、あるいは Turbo Linux とかの 商品 (1万程度) を買うのがいいんじゃないですかね。 その後はネット環境を整えたり、プログラミングしたり 好きなことをすると。 |
|
68userさんありがとうございました!!助かりました!また質問するときがあると思いますがそのときはよろしくおねがいします!! |
|
こんにちは。 私はWindowsにActivePerlを入れてCGIやっています。 今回、PPMを使おうと思って、DOS窓でppmと入力したら、 下のようなメッセージが出てきました。 Failed to load PPM_DAT file Can't use an undefined value as a SCALAR reference at C:/Perl/site/lib/PPM.pm line 1586, <DATA> line 36. なんかエラーが出てるようなのですが、PPM.pmというのはいじった 覚えがないし、他のファイルもいじった覚えはなし、上のエラーが 何を意味するのかよく分からないし、Googleなどで検索かけてもみ たのですが、同じ様な事例は見つからず困っています。 どなたか分かる方いましたら、どうすればいいのか教えてください。 お願いします。 Win98,ActivePerl5.6.0(Binary build 623) |
|
>>2411 ぶぶ さん、こんばんは。 めったに ActivePerl は使わないのですぐにはわからないんですが 手もとの環境では C:/Perl/site/lib/PPM.pm の 1586 行目近傍は以下のようになっていました。 1584:if (defined($location)) { 1585: if ($location =~ /[^\/]$/) { $location .= "/"; } 1586: $package = $location . $package . ".ppd"; 1587:} もしぶぶさんの環境でも同じであれば、 とりあえず 1586 行目の直前に warn "location: $location package: $package\n"; とでも入れてみて、 $location と $package の値を見てみたらいかがでしょうか。 でも、うちの環境(同じ Windows98)で ppm と入れたら その現象が再現できなかったので、 再インストールでもいいかなという気もしますが。 |
|
>>2412 ふくし 自己レスれす。(寒 >とりあえず 1586 行目の直前に >warn "location: $location package: $package\n"; これ、自分でもやってみましたけど、 C:\> ppm と打っただけではココは通らないみたいでした。 ぶぶさん、 PPM.pm の 1586 行目はぼくと同じですか? (バージョン、レベルは同じなんだけどなァ) あと、ほんとに C:\> ppm と打っただけで怒られます? それともなんか実のあること(パッケージのインストールとか)を やろうとしてます? 後者の場合は入れたコマンドを教えてください。 |
|
たびたびすいません!!今学校でパソコン同士のデータのやり取りを、Cプログラムでなんとかやろうとしているのですがわからんのですー!先生はfopenとか使えばできるだろー!!というのですが本を見てもかいてないようなかんじで(_m_!)なにしろ未熟者でわからんのですー!よろしければおしえてもらえますか? |
|
>>2414 ぶちお > 今学校でパソコン同士のデータのやり取りを、Cプログラムで > なんとかやろうとしているのですがわからんのですー! さて困ったものですね。あまりにもひどい質問の仕方です。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse は読んでいただけましたか? パソコンって何ですか? UNIX ですか? Windows ですか? それ以外ですか? 具体的な OS 名とそのバージョンは? データのやり取りって具体的に何をしようとしていますか? フロッピーからデータを読み込むことですか? LAN 経由で ファイルを読むことですか? RS-232C 経由でデータを やりとりすることですか? 今後、こういう調子の質問を続けるつもりでしたら、僕は お相手を致しかねますのでよろしく。 |
|
ふくしさん、お返事ありがとうございます。 PPM.pmの1586行目付近は、下のようになっていました。 1577:unless ($PPDfile && $$PPDfile) { 1578: foreach (keys %repositories) { 1579: my $location = $repositories{$_}{'LOCATION'}; 1580: if ($location =~ /[^\/]$/) { $location .= "/"; } 1581: $$PPDfile = $location . $package . ".ppd"; 1582: return %PPD if (%PPD = getPPDfile('package' => $$PPDfile, 1583: 'parsertype' => $parsertype, 'PPDfile' => \$$PPDfile)); 1584: undef $$PPDfile; 1585: } 1586: return unless $$PPDfile; 1587:} ちょっと違うみたいですよね。こちらの方が行が短いのでしょうか。 ちなみにDOS窓に入力したのは、 C:\>ppm これだけです。 PPM のシェルでパッケージのinstallをしようと思っているのですが、 とりあえずPPMを起動するため、入力しているのはppmという文字だけ です。そして、ppmとだけ入力すると、例のエラーが出るのです。 少ない情報ですが、何か分かりますでしょうか? やはりActivePerlを入れ直してみた方が良いのでしょうか? よろしくお願いします。 |
|
>>2416 ぶぶ 先ほど、Windows2000 に ActivePerl を入れる必要が あったので試してみたのですが、ppm とだけ 打つと PPM interactive shell ... と出てエラーは出ませんでした。 インストールしたのは最新の build 631 (perl-5.6.1) です。 再インストールは悪くない選択肢ではないかと思います。 |
|
>>2416 ぶぶ さん: いま会社で ActivePerl の環境がないのでテストできませんが、 >return unless $$PPDfile; ここで >>Can't use an undefined value as a SCALAR reference (スカラーの参照として、未定義値は使えません) ですよね。 $$PPDFile というのは、 $PPDFile というスカラー変数に スカラーへの参照(別のモノを指し示すもの)が入っていると考えて、 そのスカラーの値を返そうとしているわけですが、 そのとき $$PPDFile に undef が入っているのでくだんのエラーが 出ています。 たぶん $PPDFile という変数にもっと上の方でスカラーへの参照を セットすることを期待して動いていたのですが、 その期待が裏切られているようです。 (その上でいろいろしているのも、$$PPDFiles つまり $PPDFiles が指し示すスカラーメモリに対してで、 $PPDFiles にどのような論理で何が入っているかは 下のコードからは不明です) ・・・という風にさかのぼって研究しても勉強になると思いますが、 (意外ともうちょっとでパキッとわかったりして) いずれにせよこんなアンフレンドリーなメッセージが出て中断するのは 作者の意図と違う動作なので、再インストールでもいいと思います。 |
|
ふくしさん、68userさん、お返事ありがとうございます。 build631をインストールしてみましたら、何の問題もなくPPMの シェルが起動しました。 インストールしてから、PPM.pmを覗いてみると、1586付近は、 ふくしさんが書かれたものと同じになっていました。 前に入れていたものがおかしかったのでしょうか。入っている pmファイルがおかしいとは夢にも思わなかったので再インスト ールを試さずに質問してしまってごめんなさい。 これでやっとパッケージのinstallができます。ありがとうご ざいました。 PS. ふくしさん、エラーに関する説明ありがとうございます。 エラーの出る仕組みがよく分かりました。 |