CGI-BBS > CGI > Perl > ファイルアップロードでの上書き処理について


カレッヂ
カレッヂ


質問者 ビアンコ  投稿日 2006/7/20(木) 14:24:13
新規でファイルアップロードを行うと正常にアップロードが完了します。

その後同一ファイル名のファイルを上書き保存すると、
ファイルアップロードは完了するのですが、ファイル容量が0(ゼロ)
になってしまいます。
行っている処理内容は、下記の通りです。

------------------------------------------------------------------
# アップ対象ファイルを削除
unlink $outputfn;

# アップファイルの格納
open(OUT, ">$outputfn") or die(qq(Can't open "$outputfn".));
binmode OUT;
while (read($fh, $buffer, 1024)) {
	print OUT $buffer;
}
close OUT;
------------------------------------------------------------------

$outputfnの値は、「保存ディレクトリ/ファイル名」です。
$fhの値は、アップ前のパスとなります。

上記の「アップファイルの格納」は、新規登録時に使用しています。
その際は問題なく、ファイルアップロードが行えています。

ご存知の方、よろしくお願いします。

【習熟度】(未選択)

回答者 rescue  [削除]  投稿日 2006/7/20(木) 21:50:15
上書きするために、先にファイルを削除することは必要ないかと思います。
もちろん、削除しても問題ないですが…。

さて、これはプログラミングの癖の違いだと思いますが、私が設計するとすれば、
単純に、

# アップファイルの格納
open(OUT, ">$outputfn") or die(qq(Can't open "$outputfn".));
binmode OUT;
print OUT $buffer;
close OUT;

と書くと思いますが、どうなのでしょうか?

read()文は殆ど使ったことがないので、どういう動きをするかは文法書でも
見ながらになってしまいますので、「なぜ」そうなるかまでは説明は控えておきます…汗

----
サポート掲示板利用ご案内の通り、当方はバグと思われる事象以外には参加しません。
ただ、時間が許す場合に例外的に回答する場合がありますが、継続的にやりとりが
出来ない場合があります。ご理解ください。
質問者 ビアンコ  [削除]  投稿日 2006/7/24(月) 11:08:40
rescueさん
ありがとうございます。
教えて頂いた方法でも、上書き処理は容量0となってしまいました。
他に問題があるのでしょうか?
ご存知の方、よろしくお願い致します。
回答者 rescue  [削除]  投稿日 2006/7/24(月) 11:15:40
前提条件としてまず確認するのは、Quotaです。使える容量が一杯の時にファイル操作を
すると、同じような現象が起きます。あとミスしやすいのはファイルを正しく閉じていない
場合に起きることがあります。しかし、不思議ですね。
質問者 ビアンコ  [削除]  投稿日 2006/7/24(月) 16:43:10
別な方法を考え、下記のようにおこなってみたのですが、ファイルが多き過ぎると
ファイルの一部が破損し、ネットワーク上のPCのファイルをアップしようとすると
容量がゼロになってしまいます。

-----------------------------------------------------------------
# アップファイルの格納
open(IN, "$fh");
open(OUT,">$outputfn") or die(qq(Can't open "$outputfn".));
binmode OUT;
while (read(IN, $buffer, 1024)) {
	print OUT $buffer;
}
close OUT;
close IN;
-----------------------------------------------------------------

回答者 rescue  [削除]  投稿日 2006/7/24(月) 20:55:00
極単純に、上書きすれば書き換わるだけのはずなので、何か全く別のところに何か原因が
あるような気がしてなりません。お役にたてず…

何か気がついた方がいらっしゃいましたらサポートお願いできれば幸いです。
質問者 ビアンコ  [削除]  投稿日 2006/7/25(火) 16:35:07
確認した所、while文の処理を行っていないという事が判明しました。
上書き処理の場合、while文を通らずcloseしてしまう為、ファイル容量が
0(ゼロ)となってしまうようです。

------------------------------------------------------------------
# アップ対象ファイルを削除
unlink $outputfn;

# アップファイルの格納
open(OUT, ">$outputfn") or die(qq(Can't open "$outputfn".));
binmode OUT;
while (read($fh, $buffer, 1024)) {
	print OUT $buffer;
}
close OUT;
------------------------------------------------------------------

修正対象場所が判明したのですが、どのように処理したらいいのかが全く
分かりません。

関係ないかも知れませんが、上書き処理を行う前に一時保存フォルダに対象
ファイルを格納後、上書き処理を行うという過程に変更したのですが、
結果は同じでした。
一時保存フォルダにはちゃんとした問題なくファイルのアップが出来ている
のですが、上書き処理CGIを通過すると駄目になってしまうようです。

返信(回答)する

 


Web裏技