CGI-BBS > CGI > Perl > Perlについて画像等をアップロードしたい。


カレッヂ
カレッヂ


質問者 うし  投稿日 6/16(月) 11:14:05
お世話になります

CGIperlで画像等をアップロードしたいと考えております
CGI.pmなどを使うと簡単に?できそうなのですが、初めてのCGI
なので、最初から自分で作ってみようと思っています

さて、現在の状態ですが
自分のPC(Win98)にApacheをいれて、そこで実験をおこなっております

print "<FORM METHOD=POST ENCTYPE=\"multipart/form-data\" ACTION=\"boardtest.cgi\">\n";
print "お名前:<INPUT TYPE=text NAME=FROM SIZE=54 VALUE=\"\"><br>\n";
print "<TEXTAREA ROWS=3 COLS=60 NAME=MESSAGE></TEXTAREA><br>\n";
print "<INPUT TYPE=file NAME=TENSOU><br>\n";
print "<INPUT TYPE=submit VALUE=\"送信\">\n";
print "</FORM>\n";
で情報を送信し
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
で受け取っています

45k程度のファイル(test.jpg)を送信したところ
$ENV{'CONTENT_LENGTH'}のサイズが46k程度になりましたが
length($buf)が1k程度になっております。
内容を確認したところtest.jpgが途中で切れているようです。
これについて、原因を教えていただけますでしょうか?
なにぶん知識不足なもので申し訳ないのですが、なるべく具体的に
お願い致します。

・test.jpgでの送信を何度か行ないましたが、同じところで切れています。
・別のファイル(test2.jpg)で送信を行ないましたが、同様に途中で切れています。
・test.jpg時のlength($buf)とtest2.jpg時のlength($buf)はサイズが違っていました。

お忙しいところ恐れ入りますが
よろしくお願い致します。

プロバイダ参照:
サーバのOS:WINサーバ
パソコンのOS:Win95系
エディタ:
FTPソフト:
サーバ移転:していない
改造:(未選択)
CGI習熟度:firsttime

回答者 まさ  [削除]  投稿日 6/16(月) 13:15:43
up.htmlの中身
------------------------------------------------------
<HTML> 
<HEAD> 
<TITILE>ファイルのアップロード</TITLE> 
</HEAD> 
<BODY> 
<h2>ファイルのアップロード</h2> 
<FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"><P> 
ファイル: <INPUT TYPE="file" NAME="TENSOU" SIZE="32"><BR> 
<INPUT TYPE="submit" VALUE="送信"> 
</FORM> 
</BODY> 
</HTML>

up.cgiの中身
------------------------------------------------------
#!/usr/local/bin/perl

$BUFSIZE = 2048;

use CGI;

$q = new CGI;
$filename = $q->param('TENSOU'); 

while(read($filename, $buffer, $BUFSIZE)) {
   $file .= $buffer;
   $file_size ++; 
} 

$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;

一応これで正常に動くことを動作確認しました。
あとは適当に変更してみて下さい。

質問者 うし  [削除]  投稿日 6/16(月) 13:27:40
まさ様
ご回答大変ありがとうございます。
検証までして頂いて恐縮しております。

わかりにくかったようで申し訳ありません。
現在はCGI.pmを使わずに作成しています。
また、できれば使いたくないと考えています。
理由はCGI.pm(の一部分)がどのようなことをしているのかを納得した上で使いたい。
また、現在勉強中なのでなるべく自分自身で作ってみたい。
です。

read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
を行なったときに、$bufにはメールのような形式のデータがはいってきます。
区切り文字(-------?????等)をつかって情報を分割し処理しようとおもっています。

以前の例で行きますと、$bufには送付された全ての情報が入っているべきだと思うのですが
実際には入っていないようです。
それは、私のデータ取得方法に間違いがあるのでしょうか?
せっかくご回答頂いたのに覆してしまうようで心苦しいのですが、
何卒ご回答よろしくお願い致します。


ご回答いただいた内容は理解致しました。
大変ありがとうございます。
質問者 うし  [削除]  投稿日 6/16(月) 14:40:37
ご回答ありがとうございます。

無理を言って申し訳ありません。

サーチエンジンなどではいろいろ調べました。
どうしてもわからなかったので、こちらにご相談させていただいたのですが、
かなりむずかしいことのようですね。

ご紹介のあったcgi-lib.plも一度見てはいるのですが、書いてある内容が
わたしにとってはとてもむずかしかったため、理解できなかったのです。

もう一度cgi-lib.plを確認してわからないようでしたら
CGI.pmをつかってお教え頂いた方法を使いたいと思います。

いろいろとありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技