これが怖いの自分だけ?というものありますか?

いつもお世話になります。
ファイルアップロードファイルを下記のように作成しました。
その後の処理でファイル名を記録しようと思ったのですが、
下記のように記述するとファイル名がフルパスになってしまいます。
(ファイル名:.$inLINK.)
ファイル名をカットする方法(例:c:\temp\test.txt->test.txt)にするにはどうしたらよいのでしょうか?
ファイル拡張子はtxtだけではなく、doc、xls、pdfなど多岐にわたります。
どなたかご教示お願いいたします。
※できればこの記録したファイルを読込んでリンク表示する方法も教えて下さい。
-----------ファイル記録処理------------------------------------
print DATA $lTMPTabl[0]."<>".$inTITLE."<>".$inMAIN."<>".$inDATE."<>".$inSEL."<>".$inLINK."<>".$inFLAG."<>".$inCATE."\n";
--------------------------------------------------------
---------ファイルアップロード--------------------------------
$BUFSZ = 2048;
$file = '';
$buffer = '';
if ($inLINK ne '')
{
while ($bytesread = read($inLINK, $buffer, $BUFSZ))
{
$file .= $buffer;
}
open(OUT, "> ../upload/$inLINK");
binmode(OUT);
print(OUT $file);
close(OUT);
}
------------------------------------------------------------

A 回答 (5件)

>長いファイル名でも対応可能でしょうか?


 できます。わざとそういうふうに作りましたので。

>こちらで表示ができておりません。
 ブラウザ上ではHTMLはどのように見えていますか?
 正しいパスを指し示しているか、またはその位置にファイルがちゃんと存在しているかを調査してみてください。
 また、もしパスが正しいのであれば、.htaccess などを書き換えてMIMEを調整するか、もしくはダウンロード専用のCGIが別に必要かもしれません。(自信なし)

この回答への補足

deagle様度々ありがとうございます。
再度確認いたします。
$inLink =~ s/^.*[\\\/]//;は下記プログラムの
open(OUT, "> ../upload/$inLINK");直前でよろしいのでしょうか?
何度も申し訳ありませんが、挿入位置を教えて下さい。
-------------------------------------------------------------
$BUFSZ = 2048;
#$file = '';
#$buffer = '';
#if ($inLINK ne '')
#{
#while ($bytesread = read($inLINK, $buffer, $BUFSZ))
#{
#$file .= $buffer;
#}
#
#open(OUT, "> ../upload/$inLINK");
#binmode(OUT);
#print(OUT $file);
#close(OUT);

補足日時:2006/04/26 17:10
    • good
    • 0

ちなみにアップ元の環境は


Windowsだけを考えればいいんですか?
それによって違ってきますけど
File::Basenameを使った方がスマートじゃない?

この回答への補足

dondon5959様おはようございます。昨日は作業途中で眠ってしまいました...アップ環境はWINが圧倒的ですが、MACも一部ございます。不勉強で申し訳ありませんが、Basenameとはどのようなものでしょうか?

補足日時:2006/04/27 08:34
    • good
    • 0

>このアップロードの部分は抜粋です。


 了解しました。
 あと、read() 関数の第1引数は、ファイル名ではなくファイルハンドルを記載します。(先の回答にこの件を書き忘れました)

この回答への補足

deagle様本当に本当にありがとうございます。
大変参考になりました。現在リンク解明に全力投球中です。
一応リンクに関して不明点がありますので、この質問のクローズしませんがご了承下さい。

補足日時:2006/04/26 18:45
    • good
    • 0
この回答へのお礼

deagle様おはようございます。昨日は色々ありがとうございました。$inLink =~ s/^.*[\\\/]//;をif ($inLINK ne '')の直前に付加しましたが、ファイル名がc:\temp\test\cgi\test.cgiのようにロングネームになったままになってしまいます。WINDOWSクライアントからlinuxサーバーにアップロードする為、ロングネームのままだとファイルがリンクが張れません。ご面倒ですが、ファイル名をtest.cgiにする方法を教えて下さい。ご面倒をお掛けして申し訳ありません。

お礼日時:2006/04/27 11:03

>挿入位置を教えて下さい。


 "# if ($inLINK ne '')" この行の直前が無難でしょう。
 それと、if 文内の read() 関数の使い方がなんか適当っぽいんですが、これはわざとですか?
 もしわざとでなければ、前とあとに別途 open 文と close 文を追加する必要があるかと思います。(サーバー上にすでにファイルがあるんであれば)

この回答への補足

deagle様本当にありがとうございます。
open 文と close の件ですが、このアップロードの部分は抜粋です。
そのほかのファイルに関してはopenとcloseをしております。
※検討違いであればご指摘をお願いします。
先ほどのリンクの件ですが、ソース表示でみた所リンクが張られていないようでした。見直してみます。何かヒントなどありましたらお願いします。頼ってばかりで申し訳ありません。

補足日時:2006/04/26 17:55
    • good
    • 0

 $inLink を使う直前に下記の1文を追加します。



 $inLink =~ s/^.*[\\\/]//;

 ちなみに画面上に表示する方法は、通常 <A> タグで表示するだけだと思うのですが、何が問題になっているのですか?

この回答への補足

deagle様ご回答ありがとうございます。
$inLink =~ s/^.*[\\\/]//;についてですが、C:\TEMP\TEST.TXTだけでなくc:\デスクトップ¥test\temp\doc\test.txt等という長いファイル名でも対応可能でしょうか?
ご面倒ですがご解説をお願いいたします。

またファイルのリンクについては別プログラムで下記(抜粋)のような記述をしております。こちらで表示ができておりません。
何か方法はあるのでしょうか?
大変恐縮ですが、本日中に作成の仕事で困っております。
何卒よろしくお願いいたします。
-------------------------------------------------
$tPutIconA= "<a href=\"../upload/$sNewsData[5]\"><img src=\"../img/btn_html.gif\" alt=\"\" width=\"27\" height=\"37\" border=\"0\"></a>";
$tPutIconB= "<a href=\"../upload/$sNewsData[5]\">$sNewsData[1]</a>";
}

補足日時:2006/04/26 16:07
    • good
    • 0

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


おすすめ情報