68user's page 掲示板

Prev< No. 2403〜2419> Next  [最新発言に戻る] [過去ログ一覧]
No. 2403 # ふくし [E-mail] 2002/01/09 (水) 21:35:24
いつもお世話になります。
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();

とやると、空ファイルが作成されるだけでうまくアップロードできません。
エラーログには何も出ません。
なにがおかしいのでしょうか?
何かおわかりでしたらご教示願います。

No. 2404 # 68user 2002/01/09 (水) 21:50:33
ん〜、

>>2403 ふくし
> -method=>'form'
post?
> -enqtype=>'multipart/form-data'
enctype?

とか?

No. 2405 # ふくし 2002/01/10 (木) 14:41:14
>>2404 68user
さん、本年もよろしくお願いします。
ん〜、ほんとにそれだけのことでした。;;;
恥の掻き初め(寒)ですね。

最初、-enctype を指定していなかったんです。
そうすると start_form がデフォルトで
application/x-www-form-urlencoded を取るので
失敗していたようです。
(その場合 start_multipart_form を使えばデフォルトが
    multipart/form-data になるようですね)

method も post がデフォルトなので書いていなかったのですが、
html と最大限あわせようと思って質問の直前に書いて、
それで失敗していたのでした。

ハッシュによる名前付け編集の渡しは、
存在しないキーを渡しても無視されるのはなんかわかりますけど、
存在するキーに定義されてない値を渡しても怒られないのは
ちょっと CGI.pm が不便だなあと思いました。
いずれにしても、これらのケースでエラーを出して欲しいです。
(出す方法あったりして、、)

とまれ、ありがとうございました&すいませんでした。
本年もよろしくです。

No. 2406 # 68user 2002/01/11 (金) 17:21:39
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 を見る限りでは、エラー検出する
方法はないようですね。

> 本年もよろしくです。
こちらこそよろしくお願いします。

No. 2407 # 68user 2002/01/11 (金) 17:38:54
>>2406 68user
う、一行目が欠けてしまって意味不明に。

一行目は
    「お仕事で proxy サーバ経由の SSL 通信を行う必要があったので、メモメモ。」
でした。

No. 2408 # ぶちお 2002/01/11 (金) 17:48:49
UNIXを勉強したい人ってはじめは何をすれば良いか教えてください!
ほんとにくだらない質問をしてすいませんが、おねがいします!!

No. 2409 # 68user 2002/01/11 (金) 23:04:07
>>2394 Ka23
> UNIX プログラミング FAQが以下に移転しています。
遅くなりましたが反映しました。ありがとうございました。

>>2408 ぶちお
> UNIXを勉強したい人ってはじめは何をすれば良いか教えてください!
本屋に行ってインストール記事の載っている雑誌か、
インストール本を買うか、あるいは Turbo Linux とかの
商品 (1万程度) を買うのがいいんじゃないですかね。

その後はネット環境を整えたり、プログラミングしたり
好きなことをすると。

No. 2410 # ぶちお 2002/01/14 (月) 21:38:40
68userさんありがとうございました!!助かりました!また質問するときがあると思いますがそのときはよろしくおねがいします!!

No. 2411 # ぶぶ 2002/01/15 (火) 19:03:05
こんにちは。
私は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)

No. 2412 # ふくし [E-mail] 2002/01/15 (火) 22:27:55
>>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 と入れたら
その現象が再現できなかったので、
再インストールでもいいかなという気もしますが。

No. 2413 # ふくし 2002/01/15 (火) 22:47:49
>>2412 ふくし
自己レスれす。(寒

>とりあえず 1586 行目の直前に
>warn "location: $location package: $package\n";

これ、自分でもやってみましたけど、
C:\> ppm
と打っただけではココは通らないみたいでした。

ぶぶさん、
PPM.pm の 1586 行目はぼくと同じですか?
(バージョン、レベルは同じなんだけどなァ)

あと、ほんとに
C:\> ppm

と打っただけで怒られます?
それともなんか実のあること(パッケージのインストールとか)を
やろうとしてます?
後者の場合は入れたコマンドを教えてください。

No. 2414 # ぶちお 2002/01/16 (水) 00:22:40
たびたびすいません!!今学校でパソコン同士のデータのやり取りを、Cプログラムでなんとかやろうとしているのですがわからんのですー!先生はfopenとか使えばできるだろー!!というのですが本を見てもかいてないようなかんじで(_m_!)なにしろ未熟者でわからんのですー!よろしければおしえてもらえますか?

No. 2415 # 68user 2002/01/16 (水) 03:52:02
>>2414 ぶちお
> 今学校でパソコン同士のデータのやり取りを、Cプログラムで
> なんとかやろうとしているのですがわからんのですー!
さて困ったものですね。あまりにもひどい質問の仕方です。
    http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
は読んでいただけましたか?

パソコンって何ですか? UNIX ですか? Windows ですか?
それ以外ですか? 具体的な OS 名とそのバージョンは?

データのやり取りって具体的に何をしようとしていますか?
フロッピーからデータを読み込むことですか? LAN 経由で
ファイルを読むことですか? RS-232C 経由でデータを
やりとりすることですか?

今後、こういう調子の質問を続けるつもりでしたら、僕は
お相手を致しかねますのでよろしく。

No. 2416 # ぶぶ 2002/01/16 (水) 13:47:46
ふくしさん、お返事ありがとうございます。

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を入れ直してみた方が良いのでしょうか?

よろしくお願いします。

No. 2417 # 68user 2002/01/16 (水) 14:25:46
>>2416 ぶぶ
先ほど、Windows2000 に ActivePerl を入れる必要が
あったので試してみたのですが、ppm とだけ
打つと
    PPM interactive shell ...
と出てエラーは出ませんでした。

インストールしたのは最新の build 631 (perl-5.6.1) です。
再インストールは悪くない選択肢ではないかと思います。

No. 2418 # ふくし 2002/01/16 (水) 14:35:51
>>2416 ぶぶ
さん:

いま会社で ActivePerl の環境がないのでテストできませんが、
>return unless $$PPDfile;
ここで
>>Can't use an undefined value as a SCALAR reference
(スカラーの参照として、未定義値は使えません)
ですよね。

$$PPDFile というのは、
$PPDFile というスカラー変数に
スカラーへの参照(別のモノを指し示すもの)が入っていると考えて、
そのスカラーの値を返そうとしているわけですが、
そのとき $$PPDFile に undef が入っているのでくだんのエラーが
出ています。

たぶん $PPDFile という変数にもっと上の方でスカラーへの参照を
セットすることを期待して動いていたのですが、
その期待が裏切られているようです。

(その上でいろいろしているのも、$$PPDFiles つまり
    $PPDFiles が指し示すスカラーメモリに対してで、
    $PPDFiles にどのような論理で何が入っているかは
    下のコードからは不明です)

・・・という風にさかのぼって研究しても勉強になると思いますが、
(意外ともうちょっとでパキッとわかったりして)
いずれにせよこんなアンフレンドリーなメッセージが出て中断するのは
作者の意図と違う動作なので、再インストールでもいいと思います。

No. 2419 # ぶぶ 2002/01/16 (水) 15:10:06
ふくしさん、68userさん、お返事ありがとうございます。

build631をインストールしてみましたら、何の問題もなくPPMの
シェルが起動しました。

インストールしてから、PPM.pmを覗いてみると、1586付近は、
ふくしさんが書かれたものと同じになっていました。

前に入れていたものがおかしかったのでしょうか。入っている
pmファイルがおかしいとは夢にも思わなかったので再インスト
ールを試さずに質問してしまってごめんなさい。

これでやっとパッケージのinstallができます。ありがとうご
ざいました。

PS.
ふくしさん、エラーに関する説明ありがとうございます。
エラーの出る仕組みがよく分かりました。

Prev< No. 2403〜2419> Next  [最新発言に戻る] [過去ログ一覧]