- PR -

ASP.NETでのファイルアップロードについて

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-25 08:59
引用:

かるあさんの書き込み (2006-06-24 00:38) より:

いえ、ですのでこれはポストされた後の話ですよね
ポスト前にJavaScriptでも取得できないのかなーと

#今日会社で試そうとしたらそんな時間すらなかった…


ええ、JavaScript でとれない、つまり
if (! Fs.FileExists(ファイルパス入力フィールドのID.value) ) {
ここがすで通らないわけです。

 FileSystemObject が ActiveX Object だから云々ではないのです。
もちろん、ファイルの選択をするものも ActiveX Object で作れば、それは通ります。
しかし、セキュリティ レベルがデフォルトでは、「低」でなければ ActiveX Object の作成ができませんでした。もちろん、カスタマイズすれば、「中低」以上でも作成できるでしょう。


 で、もし、JavaScript でとれるなら。
Submit 前に 他の input 要素にコピーしてしまえば、サーバ側でディレクトリがわかってしまいますよね?
それって、セキュリティ強化の意味をなさないと思いませんか?


引用:

input 要素の type 属性を file にして、“パス名だけ”をもらっているのですが、IE7 では value 属性からはパスをのぞいた“ファイル名だけ”しか取得できなくなっています。

ファイルをアップロードすると容量的な問題や、アップロード可能な最大サイズの問題などがあるので、パス名だけをもらって、そのパス名に対するリンクを表示するようにしていたんだけど。。。困ったなぁ。。。


ブログにこう書いているのですが。
これは、次のようなことをしています。
コード:

<form onsubmit="return beforePost();">
<input type="file" id="fileSelect">
<input type="hidden" id="fileName">
<script>
function beforePost() {
fs = document.getElementById("fileSelect");
fn = document.getElementById("fileName");
fn.value = fs.value; // パス名だけもらい、
fs.value = ""; // ファイルはアップロードしない
return true;
}
</scrit>
</form>


これが、IE7β1 では、ファイル名しか渡らなくなってしまいました。
これでいいですか?

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-06-25 13:07 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-06-25 14:01
で少しやってみました。
コード:

<form id="form1">
<input type="file" id="fileBox" />
<input type="button" id="cmdShowFileName" value="表示" onclick="showFileName()" />
</from>
<script type="text/javascript">
function showFileName() {
var fileBox = document.getElementById("fileBox");
alert("value=<" + fileBox.value + ">\n" +
"innerText=<" + fileBox.innerText + ">\n" +
"innerHTML=<" + fileBox.innerHTML + ">");

var f = document.forms["form1"];
alert(f.innerHTML);
}
</script>


document.forms["form1"].innerHTML を見ても
fileBox の value にはパスが入っていないんですね

#検証コードかいてたらすでに jitta さんの投稿が・・・

[ メッセージ編集済み 編集者: かるあ 編集日時 2006-06-25 14:31 ]
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-26 12:24
引用:

Jittaさんの書き込み (2006-06-25 08:59) より:
ええ、JavaScript でとれない、つまり
if (! Fs.FileExists(ファイルパス入力フィールドのID.value) ) {
ここがすで通らないわけです。
(中略)
 で、もし、JavaScript でとれるなら。
Submit 前に 他の input 要素にコピーしてしまえば、サーバ側でディレクトリがわかってしまいますよね?
それって、セキュリティ強化の意味をなさないと思いませんか?


これに関しては、激しく納得しました。

ただ、私の環境 Win2K SP4 + IE6.0 SP1 なのですが、
引用:

コード:
      fs.value = ""; // ファイルはアップロードしない




これは動きませんでした。
<input type=file>に関しては、たとえ空文字であろうとスクリプトからの値のセットは
できないと解釈していたのですが、ブラウザに依存するのでしょうか?

更に、本題に戻りますが、
引用:

がんふぃーるどさんの書き込み (2006-06-22 12:39) より:
使用しているOSとブラウザがXP SP2とIEなら以下のURLに記述されていることが原因かと思われます。

http://support.microsoft.com/default.aspx?scid=kb;ja;890981

IEは指定されたパスがローカルや共有フォルダのパスでないと判断すると、
サーバに要求を出さないみたいです。


自分の環境で試したところ、文字列の形式さえ合っていれば、
ファイルシステム上に実際にそのファイルが存在するかどうかは関係ないみたいなので、
IE6以前に関して言えば、FileSystemObjectなんか使わず、
単純に正規表現で文字列の形式だけチェックしてやればOKぽいです。
ただ、IE7対策についてはいい方法が思いつきません。
ちなみに、Win2K SP4 + IE6.0 SP1では、"C"一文字でも普通にsubmitできました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-27 06:18
引用:

ぼのぼのさんの書き込み(2006-06-26 12:24)より:
ただ、私の環境 Win2K SP4 + IE6.0 SP1 なのですが、
(略)
これは動きませんでした。
<input type=file>に関しては、たとえ空文字であろうとスクリプトからの値のセットは
できないと解釈していたのですが、ブラウザに依存するのでしょうか?


すみません。 fs.disabled = true; でした。
大きなファイルをポストして、サーバ側のリミットにかからないように、

ユーザには選んでもらうが、ファイルをポストしない

ことが目標なので。
アルゴ
常連さん
会議室デビュー日: 2004/10/06
投稿数: 36
投稿日時: 2006-06-27 10:08
皆様、色々なご意見ありがとうございます。

今回はFileSystemObjectを使わずに
1.<asp:button>と<input type button>を配置する。
2.<asp:button>はVisibleをFalseにして見えなくしておく。
3.<input type button>はrunat="server"を指定しないで
 「アップロード」という名前にする。
4.<input type button>が押下されたら正規表現でチェックしてOKなら
 <asp:button>をクリックする。

以上の手順で上に提案しようと思います。
もちろんIE7のことも報告します。

セキュリティーの問題も含んでいるので、
納得してもらえると思います。

引続きIE7対策で良い案があれば教えていただけると助かります。
皆様、宜しくお願いします。

スキルアップ/キャリアアップ(JOB@IT)