本日、同じ質問をしたものです。
前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。

CGIのプログラムは以下のソースです。

#! c:/perl/bin/perl

use CGI;
# CGIヘッダーの出力
print "Content-type: text/html\n\n";

my ($query,$fileName);
$query = new CGI;
$fileName = $query->param('fileName');

open(OUT, ">./a.csv");
binmode(OUT);
while(read($fileName,$buffer,1024))
{
print OUT $buffer;
}

close(OUT);
close($fileName); #ファイルハンドルをcloseしています。

exit ;

ファイルは、作られるのですが、中身が書き込まれません。

どなたか教えてください。

お願いします。

A 回答 (1件)

$fileName = $query->param('fileName');


で取得できるのはアップロードしたときのファイル名で、CGI.pmはそのファイル名とは別の名前でサーバ上に一時ファイルを作ります。

$query->upload()で一時ファイルのファイルハンドラを取得し、ファイルの内容を読み出します。
$fh = $query->upload('fileName');
read($fhe,$buffer,1024);
...
    • good
    • 5
この回答へのお礼

御礼が遅くなり申し訳ありません

おっしゃる通りにやってみましたところ、できました。

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

お礼日時:2011/04/26 08:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアップロードの意味

先日こちらでバナー広告(ポイントサイト)のアップロード方法を
教えて頂きなんとかできましたが疑問があります。

実は2台のPCでブログの作業しています。
そういう場合は2台のPCともアップロードしないといけないですか?
というのは、ポイントサイトは紹介ポイントというのがありますので
クッキーとか何かそういう関係?があるのかな?と。。。

一度アップロードした画像URLを使って
<a href="リンク先URL"><img src="バナー画像URL" border="0"></a>
に当てはめて記事を書いても問題ないでしょうか?

とりとめの無い質問ですみません。
どなたかこの質問内容でお解り頂けたら教えて欲しいです。

Aベストアンサー

前の質問が私はわからないのですが(すみません)、
一度アップロードしたのであれば、2台目以降はやる必要はないと思います。
アップロードというのは、一般的には離れたコンピュータにファイルを送ることなので、
PCが変わっても、送った先のコンピュータが変わるわけではなく、
影響はありません。
一度アップロードしたものはあるユニークなアドレスで、世界中のPCから参照することができます。
(それがURLというものです)

Qperlでのcsv形式のテキストファイルの変換

perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。

【変換前】
10, abc , def , ghi ,jkl    ----1行目
10, abc , def , aaa, bbb   ----2行目
10, abc , def , ccc , ddd  ----3行目
11, abc , def , eee , fff   ----4行目
11, abc , def , aaa , ggg ----5行目
11, zzz , def , aaa , ggg  ----6行目
12, abc , def , aaa ,ggg ----7行目
12, zzz , def, aaa , ggg   ----8行目

【変換後】
10, abc , def , ghi ,jkl    ----1行目
11, abc , def , eee , fff   ----4行目
11, zzz , def , aaa , ggg  ----6行目
12, abc , def , aaa ,ggg ----7行目
12, zzz , def, aaa , ggg   ----8行目

変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が
前の行の先頭3列と同じならその行は出力しない、といった
変換をしたいと思っております。
(例えば2行目ですと先頭3列は10, abc ,defになっており、
 1行目の先頭3列と同じ文字列になっているためこの行は出力しない)

当方、Perl初心者で上記のようなことがPerlでできるかも
よくわかっておりません。
そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら
どのようにPerlで記述すればできるのか教えていただけないでしょうか。

よろしくお願いいたします。

perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。

【変換前】
10, abc , def , ghi ,jkl    ----1行目
10, abc , def , aaa, bbb   ----2行目
10, abc , def , ccc , ddd  ----3行目
11, abc , def , eee , fff   ----4行目
11, abc , def , aaa , ggg ----5行目
11, zzz , def , aaa , ggg  ----6行目
12, abc , def , aaa ,ggg ----7行目
12, zzz , def, aaa , ggg   ----8行目

【変換後】
10, abc , def , ghi ,jkl    ----1行目
11, abc , ...続きを読む

Aベストアンサー

そのまま実装しました。
省略表現が初心者には難しいかもしれませんが、その分見やすいと思います。
インデントは全角スペースになっています。

#!/usr/bin/perl
use strict;

my($m1, $m2, $m3);
open(IN, "in.csv") or die;
open(OUT, "> out.csv") or die;

while(<IN>){
 my($n1, $n2, $n3) = split /,/;
 if($n1 eq $m1 && $n2 eq $m2 && $n3 eq $m3){
  next;
 }else{
  ($m1, $m2, $m3) = ($n1, $n2, $n3);
  print OUT;
 }
}

Qドリームウィーバー(500 illegal port range rejected)の意味は?アップロードについて教えてください!

サイトをつくりました。そしていざアップロードができずにこまってます。『PUT』でアップロードしようとすると、すべてのhtmlファイルが『500 illegal range rejected』となってアップロードできないのです...もう、なんどトライしてもなぜか。できません。どなたか、なにかヒントをいただけないでしょうか~...おねがいいたします。

Aベストアンサー

とりあえず、Passiveモードで転送してみる。
そのような設定ができたはずです。

どうでしょう?

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

ファイルのアップロードでCGI::Liteを使っています。
PerlはActivePerlのバージョン5.8ですが
アップロード先のデータの中身が変わってしまい、
画像データなのに別のファイルになって表示されなくなりました。

これはファイル自体の文字コード変換が絡んでいるということですか?

また、CGIとCGI::Liteの違いですが、両方使ってもよいのでしょうか?

Aベストアンサー

モジュールのソースに binmode 入れるといいみたいですよ。
(参考URLのページ参照)

おそらく UNIX 系 OS で開発したので気が付かなかったんでしょう。(UNIX系OSはテキストもバイナリも区別してなくて全部バイナリですから)。

参考URL:http://digit.que.ne.jp/work/index.cgi?Perl%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%2FCGI%3A%3ALite

Qダウンロードとアップロードの意味

FOM出版から出ている本に、ダウンロードは「ネットワーク上にあるデーターを自分のコンピューターにコピーすること」、アップロードは「自分のコンピューターにあるデーターをネットワーク上にコピーすること」とあったのですが、ここではコピーというより“転送”の方が適切かなと思いました。

しかし、転送としてしまうとファイルが元あった場所から、なくなってしまうニュアンス(郵便物を転送すると言いますし)になってしまうような・・・実際は、ファイルをダウンロード・アップロードしても元あった場所から、なくなるわけではないので、やはりコピーかなと。

二転三転してすいませんが、どういう言葉が適切なのでしょうか?

Aベストアンサー

”コピー”が適切かと思います。
”転送”ですと、移動って意味もありますので

ただ、データ通信の場合は、送信と言う意味もありますので、あまり気にしなくてもよいと思います

Qperlで、可変の個数のファイルをアップロードしたい

perlで、可変の個数のファイルをアップロードしたい

perlで、可変の個数のファイルをサーバに
アップロードさせたいのですが、
どのようにやって良いのかまったく検討がつきません。

参考になるサイト、でもかまいませんが、
こちらにロジックを書いて頂けると幸いです。
どうぞ、宜しくお願いいたします。

Aベストアンサー

「1個アップロードする」のを繰り返すだけでは? この部分に難しいところなどないはずですよ.
もちろん (「可変個」のファイルをアップロードする方法がわからんということなので) 1個のファイルがアップロードできることは当然の前提にしてますが.

Qダウンロードはアップロードというものも同時に行われているのですか?

ダウンロードはアップロードというものも同時に行われているのですか?

(ウイルスという例を除いてご回答よろしくお願いします。)
普通にネットで動画や画像等をファイヤーフォックスなどを利用し、ダウンロードする際に同時にアップロードというものも、おこなわれているのでしょうか?アップロードがいまいち意味不明です。

過去に似た質問していてすみません、よろしくお願いします。

Aベストアンサー

自分のパソコン内にある画像、音楽、動画、その他のファイルを
ネット上に公開(サーバーにコピーを保存するなど)して誰でも見れるように(場合によってはパスワードをかけます)することを「アップロード」といいます。

例:ブログに写真を載せる、YouTube等に動画を投稿する、などの行為。

なのでアップロードする側は著作権を考慮しなければいけませんし、写真や動画などは他人や個人が特定できるような物などが写り込んでいないかなどに気をつけなければいけません。

「ダウンロード」は「アップロード」されているファイルを自分のパソコン内にコピーして保存することをいいます。

QPerl使用のアップローダーで、jpgだけアップロードできない。

●フォームのcgiは

----------
print "Content-type:text/html\n\n";
print "<FORM method='POST' action='2.cgi' enctype='multipart/form-data'>\n";
print "<INPUT size='40' type='file' name='upfile'> \n";
print "<INPUT type='submit' value='送信する'>\n";
print "</FORM>\n";
----------

●実際のcgiは
----------
require './cgi-lib.pl';
print "Content-type:text/html\n\n";

#フォームからのデータを受け取る
&ReadParse;

#ファイル名を指定する
$fnme = 'sample';

##################
# 拡張子を求める #
##################
$substrings1 = "\\";
$ichi = rindex $in[1], $substrings1;
$search_moji = substr($in[1], $ichi);

$substrings2 = ".";
$substrings3 = "\"";
$start_position = index $search_moji, $substrings2;
$start_position = $start_position;
$finish_position = index $search_moji, $substrings3;
$moji_count = $finish_position - $start_position;

$file_type = substr($search_moji,$start_position,$moji_count);

$fnme = $fnme . $file_type;

# 受信データを書き込む
open OUT,">$fnme";
binmode OUT;
print OUT $in{'upfile'};
close OUT;

$mes = '書き込みが完了しました。';

#完了メッセージ
print <<"HTML";
Content-type: text/html

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</HEAD>
<BODY>
$mes
</BODY>
</HTML>

HTML

exit;
----------
です。

txt、bmp、gif、xlsはテストしたところちゃんとアップロードされましたが、jpgだけができません。
特に制限はかけたつもりはないのですが、どこが原因でjpgのみダメなのでしょうか?

●フォームのcgiは

----------
print "Content-type:text/html\n\n";
print "<FORM method='POST' action='2.cgi' enctype='multipart/form-data'>\n";
print "<INPUT size='40' type='file' name='upfile'> \n";
print "<INPUT type='submit' value='送信する'>\n";
print "</FORM>\n";
----------

●実際のcgiは
----------
require './cgi-lib.pl';
print "Content-type:text/html\n\n";

#フォームからのデータを受け取る
&ReadParse;

#ファイル名を指定する
$fnme = 'sample';

######...続きを読む

Aベストアンサー

>cgi-lib.pl: Request to receive too much data: 169488 bytes

cgi-lib.plでは、全送信量に対して制限がかけられており
上限 2^17 = 131072 < 実送信量 169488 ということです。
画像送信には、これでは少なすぎるでしょうからcgi-lib.pl内の以下の行を探して
適当な値に変更してみてはいかがでしょう。
$cgi_lib'maxdata = 131072; # maximum bytes to accept via POST - 2^17

Qアップロード、そして HPへ?・・・・

私は今メモ帳でHPを作成しようとしています。
そこでどうしても分からない事が発生しました。
そのメモ帳を自分のHPに貼り付ける事です。
最近になって気付いたのですが、ひょっとしてHPにアップロードしないといけない?
ってことです・・・超初心者です!
で、アップロードの意味はわかるんですが、アップロードをするにはどうしたら良いんでしょうか?
やり方など教えてもらえると嬉いっす!

Aベストアンサー

> で、アップロードの意味はわかるんですが、アップロードをするにはどうしたら良いんでしょうか?
> やり方など教えてもらえると嬉いっす!

アップロードするには大抵はFTPソフトが必要です。中にはブラウザからアップロードできるものがありますが。
FTPソフトは#2の方が紹介しているソフトでもいいですし、もっと簡単に扱えるFTPソフトもあるので探してみてください。
色々試して自分に一番フィットするソフトを見つけてみてください。
http://www.vector.co.jp/vpack/filearea/win/net/network/copy/index.html

アップロードの方法は#1の方がおっしゃっているようにプロバイダが情報を提供しているはずです。
プロバイダのウェブサイトにホストの情報やファイルの転送方法の記述があると思うので、しっかりご覧になってください。

QPerlでCSV形式のファイルの一部分だけを抽出する方法

Perlをやっていて困っていることがあります。
CSV形式のファイルを開いて、変数に代入した後の処理がわかりません。

どのようにしたいかというと・・・

aaa,bbb,ccc,ddd,eee,fff
ggg,hhh,iii,jjj,kkk,lll
mmm,nnn,ooo,ppp,qqq,rrr
sss,ttt,uuu,vvv,www,xxx
yyy,zzz,111,222,333,444

というファイルを読み込んだとします。その後
'fff' の部分だけをスカラー変数に取り込みたいときにはどのような
関数を実行すればいいのでしょうか。

困っています、お願いします。

Aベストアンサー

fffの部分ってのは、各行の6列目ってことですか?
指摘が曖昧なので、ようわかりませんが。

open(F, $file);
@s = <F>;
@t = split(/,/, $s[0]);

とすると中身をコンマを区切り文字として、分割した配列が得られます。
$t[0]は1番目=aaa、$t[1]は2番目=bbb・・・。

これを元にお勉強してみてください。


人気Q&Aランキング