アプリ版:「スタンプのみでお礼する」機能のリリースについて

CGI_lite.pmを使いファイルをアップロードしたところちゃんとファイル自体はアップロードできているのですがファイル名が変わってしまっています。
たとえば「index.html」というファイル名ならば「980815043__index.html」と
なってしまいます。

サーバーはunixです。

どうか詳しい方教えてください。お願いします。

A 回答 (4件)

私も昔やったことがある(先代の人の直し)のでわかります。


確かにこれは厄介で困りました。

やり方は
($temp,$filename)=split /__/,$files;

$filesはファイルへのパスです(例 /uer/home/user1/980814043__html)
単に名前を変えてやれば良かったと思います
$filenameのなかを見てやればアップロードしたいファイル名になっていると思います

この回答への補足

ごめんなさい。変化なしです。おそらくファイルへのパスの$filesが別物だと思いますが、わからないので(雑誌に乗ってたやつなので)下にコピーしますのでもしおひまがありましたら、見てやってください。

よろしくお願いします。

__________________________________________________________________
use CGI_Lite;
require 'util.pl';

#
# 定数
#
$Temp = './temp';
$Platform = 'Unix';
$BUFSZ = 2048;
$CharSet = 'Shift_JIS';

$upload = new CGI_Lite;

# アップロード先
$upload->set_directory($Temp) or
exitError("ディレクトリ $Temp がオープンできません。");
# プラットフォームの設定
$upload->set_platform($Platform);
# バッファーサイズの設定
$upload->set_buffer_size ($BUFSZ);
# ファイル名の変換
$filename = $upload->filter_filename(\&convName);


$upload->close_all_files;

# フォームデータの解析
%data = $upload->parse_form_data;

if ($upload->is_error()) { # アップロードのエラー
exitError($upload->get_error_message());
}


print <<END_OF_HTML;
Content-type: text/html
省略
____________________________________________________________________

補足日時:2001/01/30 12:59
    • good
    • 0

え、ファイル名がだけ変わっているんじゃないの?


このperlファイルを見る限り

$Tempのディレクトリに送られて来たファイルが入っていて
そこからファイル名を変えて必要な場所に移動してあげれば
いいと思うんですが...

まずアップロードされたファイルがあるかどうか
確認してください

実験する場合はHTMLのようなテキストだけではなく
gifなどを混ぜて行うとちゃんと送信できたかどうかわかりますよ

この回答への補足

すいません補足しときます。確かにFTPとかでファイルの確認をすればいいと思うのですが、最終的にすべてCGIを使用する予定です。
今の時点ではファイル名がサーバーにアップロードされた時点でなにが頭につくかが判断することができません。となるとCGIでファイルのリネーム、移動などもできないのではないでしょうか。

ご指摘ありがとうございました。何か方法がおわかりになりましたらよろしくお願いします。

補足日時:2001/01/30 14:45
    • good
    • 0

うーん、わたしの説明不足だったようですね。


確認というのはSadsfanさんがデバッグのためにと言うことだったのですが...

Sadsfanさんがunixマシン(telnetでもsshでも何でもいいですが)の
前にいらっしゃると仮定します。

まず送られて来たデータは$Tempの場所に保存されます。
(私の場合は./といった相対パスではなく/home/user/tempなどにしています)
ここに
(数字の羅列)__(目的のファイル名)
と間には_(アンダーバー)を2つ挟むと言う規則で
ファイルが保存されます。
よって正規表現でアンダーバーの前の数字をとってしまえば
もとのファイル名を取得することができるのです。
*__*(<-正規表現で書いた一般の形、顔になっちゃった)

ファイルの移動はアンダーバーを含んだファイル名から
正しいファイル名にと言う感じで
cp /home/user/temp/980815043__index.html /home/user/index.html
(ごめんなさい 最近perlやってないので普通のcpコマンドでかんべんしてください)
'/home/user'や'/home/user/temp'を変数に代入しておけば
文字列の連結でできると思います

ファイルの保存先を変えるときはパーミッションに気を付けてください
多分nobodyの書けるところじゃないと書けないはずですから...

この回答への補足

ご丁寧にありがとうございました。あと肝心なことを聞きたいのですが、アップロードされたファイル名はどう取得したらよいのでしょうか。
何度も質問すいません・・・お願いします!

補足日時:2001/01/30 16:48
    • good
    • 0

1普通にテキストエリアからテキストを読むようにする


(多分これでとれたと思います)
2アップロードされたファイルから取得する
(ディレクトリの中を検索。先代はこれでやっていました)

最悪2でできるのでやってみてください
(ただしアクセスが多くなって処理し切れなくなると
どうなるか、考えただけでぞっとしますが...)

多分一番でできますのでやってみてください

っていうかソースプログラムにファイル名変換という気になる
フレーズがあるのでそっちの方が確実かも知れませんね

後は正規表現との戦いです(笑)
    • good
    • 0
この回答へのお礼

ありがとうございました。1でできました。2は使いたくないですね。恐ろしいです。

お礼日時:2001/02/02 10:26

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