[PHP-users 9867] Re: ファイルアップロードの不思議な現象

NAKAMURA Takeshi php-users@php.gr.jp
Fri, 06 Sep 2002 23:05:07 +0900


仲村です。

 最後だけ読む方が良いかと思いますです。はい。

From: SEGAMI Takashi <sage@tokyo.MicroCAD.CO.JP>
Date: Fri, 6 Sep 2002 21:54:16 +0900
Subject: [PHP-users 9863] Re: ファイルアップロードの不思議な現象

> 相変わらず、判りません。
では、説明おば(^^;

「C:\Documents and Settings\sage\デスクトップ\README.TXT」
というファイルが、あるとします。
 DOSプロンプトで
「C:」 Cドライブに移動。
「cd "C:\Documents and Settings\sage\デスクトップ\"」でディレクトリを移動
「dir」すると、README.txt っていうファイルが見えますね?
「notepad README.txt」ってすると、メモ帳で README.txt って
ファイルが開けます。

 次に、同じくDOSプロンプトで
「cd "C:\"」 として、カレントディレクトリを移動
「dir」しても README.txt ってファイルが見あたらないでしょう。
「notepad README.txt」ってやっても 無いファイルですから
    メモ帳は README.txt を C:\README.txt を作ろうとします。

 さらに、
「D:」Dドライブに移動
「dir C:」 さっきと同じ ファイルが見えていますか?
「cd どこか」 D ドライブのディレクトリを移動します。
「dir C:」 でも、C:のファイルは同じ物が見えますねぇ。
C:とした時に見えるのであれば、ファイル名の頭につけて
「notepad C:README.txt」

「cd」今いるディレクトリを表示させると Dドライブにいますね?
「cd C:..」 C: のカレントディレクトリを変更します
「cd」 でも、カレントディレクトリは Dドライブのままです。
「dir C:」 Cドライブを見てみると一つ上に移動しました。README.txtは見えません。
「notepad C:README.txt」 メモ帳は新しいファイルを作ろうとします。

「dir C:デスクトップ」 だと見えますね。
じゃ、これをファイル名の頭に付けて
「notepad C:デスクトップ\README.txt」 これだと開けますね。
「C:」 Cドライブへ移動
「cd」 C:\Documents and Settings\sage\ にいるでしょう?
「notepad デスクトップ\README.txt」 これでも、開けます
「notepad C:デスクトップ\README.txt」 これでも、開けます
「notepad "C:\Documents and Settings\sage\デスクトップ\README.TXT"」勿論フルパスなので これでも、開けます

一つのファイルを指すのに、いろいろな方法がある訳です。

 IE だって cd なり C言語(で書かれていると思う)で、chdir した
ディレクトリにあるファイルは、パスを書かなくても 同じドライブで
あれば、ファイル名だけで見つけることができます。


> でも現実は、アップロードされてしまいます。
 IE ですから...いや、試したところ mozilla も w3m もでした。

> サイズで確認したくても、例えばA:\README.txtファイルが存在すると、
> A:README.txtとタイプミスしてもA:\README.txtがアップロードされて
> しまいます。
> 宇野様の言うように、それは当然だとしても
 mozilla や、 w3m では、README.txt で渡されます。
これは、ブラウザの癖ですね。
「IEは使わないで」と、言うのも一つの手でしょう。個人ページですら最近は難しいですが...

> 今度は、PHP側で、A:README.txtというファイル名として渡ってきて
> しまいます。(サーバ側が)Windowsの場合、このファイル名では存在できません。
> 結局、アップロードされてしまうのは、しょうがないと思って、
> サーバ側がWindowsの場合、コロンを除去したファイル名に直してから
> じゃないとダメということになります。
 除去せずにURLエンコードしてもいいでしょう
# い、いかん、何か今日はチャチャが...

> このケースは非常にレアだとは思うのですが、知ってしまった以上、
> お客様に迷惑はかけれないので、なんとか力技で対処するしかないですね。
> あーぁ、面倒。
ディレクトリパスは必要ないので、ばっさりと切っちゃうのがお手軽です。

先のperlでは、こんな事してます...って言うか、さっき変えました(^^;
# Perl に basename が無い訳ないと思うんだけど...
  # ドライブ名区切りや、ディレクトリ区切り(:,/,\)より後ろ
  # ファイル名部分を抜き出す
  if ($filename =~ /[:\/\\]([\w\.\+\-]*)$/){
          $filename = $1;
  }

=== ここから読んでください ===
それには、UNIXのコマンドに basename ってのがあり phpでは
http://jp2.php.net/manual/ja/function.basename.php
basename ってのがあります。って、同じじゃん!!(笑)
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+
 関西沖縄青年の集い がじまるの会 手伝い 一人だけの勝手に神奈川支部
 仲村 武 <1Yen@Bigfoot.COM>