トップ回答者
クライアント側のファイル一覧の表示

質問
-
Visual Studio 2005 Webページ を C# で 書いています。
テキストボックス、ボタン、リストボックスを配置しています。
テキストボックスにクライアント側のファイルパスを入力
c:\
そして、ボタンクリック
protected void Button1_Click( object sender, EventArgs e )
{
string sfn;string[] swk;
int i, idata;
swk = Directory.GetFiles( TextBox1.txt, "*.txt" );
i = 0;
idata = swk.Length;
ListBox1.Items.Clear();
while( true )
{
if ( i >= idata )
{
break;
}
sfn = swk[ i ];
i++;
ListBox1.Items.Add( sfn );
} // while( true )
}これでは、サーバー側の一覧がリストに入ってしまいます。
クライアント側の一覧をリストに表示させることは、できますか?
回答
-
ローカルに保存されているhtmlの実行と、Webサーバーからやってくるhtmlの実行におけるセキュリティ設定は異なります。IEのセキュリティ設定でも、インターネットゾーンと、イントラネットゾーンとでセキュリティ設定が異なることからも想像できると思います。
ところで、サーバーサイドのコードから、クライアントのファイル一覧を直接見ることはできないでしょう。もしできれば、セキュリティ上の重大な問題となります。もし、一覧を得たいのであれば、次のようにすればできるのではないかと思います。
1.サーバーサイドで得られたフォルダのパスにおけるファイル一覧を取得するjscriptを動的に生成する。
2.そのjscriptが自動的に実行され、得られたファイル一覧をhidden項目などにセットし、サブミット。
3.サーバーサイドで、hidden項目からファイル一覧を復元。もしくは、
1.document.getElementById('<%= fileUpLoad.ClientID %>').value などとして、直接jscriptでフォルダのパスを取得し、上記の2.と3.を実行しても良いかと思います。
いずれにしても、jscriptでファイル一覧を取得しておいて、サーバーサイドにそれを渡すということになるでしょう。
すべての返信
-
http://support.microsoft.com/kb/300982/ja
を参考にしてください。ファイルシステムオブジェクトの.GetFolder()でファイルの一覧を列挙できます
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct04/hey1020.mspx
も参考になります。
-
Mooさん 情報ありがとうございます。
新規Webページ作成後 HTMLからInput(Button)を追加。
それを ダブルクリックして
<head runat="server">
<title>無題のページ</title>
<script language="javascript" type="text/javascript">
// <!CDATA[function Button2_onclick() {
alert( "aaa" );
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("c:/testfile.txt", true);alert( "bbb" );
}// ]]>
</script>
</head>これで実行しても、メッセージボックスaaa以後、何も起こらないんですけど。
Visual Studio 2005 でWebアプリを作成するときは Default.aspx が クライアント側で Default.aspx.cs がサーバー側と思っているのですが、あってますかね。
そして、Web Developerは JScript と VBScript を プロパティで選べるみたいですけど、2005には 該当する箇所が ないんです。 上記のサンプルは JScript のを貼り付けたのですが、動かないのはもっともだと思います。
Web Developer は プロパティウィンドウを DOCUMENTに変えて、下のほうドキュメントの
Default Cliant Script で JScriptとVBScriptを選択できるようです。
2005では Default Cliant Script が ないんです。META~を手打ちすれば、動くのかなと思ったのですが
<head runat="server">
<title>無題のページ</title>
<meta content="text/JScript" http-equiv="content-script-type" /><script language="javascript" type="text/javascript">
// <!CDATA[追加してやっても だめでした。
最初の質問に戻るのですが、クライアント側がjpg画像データを、数枚自分のフォルダに保存した状態で、
Webアプリを起動。自分のフォルダ内の画像を見ながら、1枚決定。それをサーバー側に保管するのをつくろうとしています。
-
そうなのです。私もFileUploadでできそうだなと思ったのです。FileUploadはクライアント側のファイル一覧がでますから。
今回の、ソースは
1.FileUploadでファイル指定
2.フォルダ名抽出
3.フォルダ内のjpgファイルをリストへ出力Directory.GetFilesがサーバー側になるんです。
ボタンのポストバックをしなければよいのだ、と考えてHTMLボタンから
protected void Button1_ServerClick( object sender, EventArgs e )
で 実行してみても だめでした。
protected void Button1_Click( object sender, EventArgs e )
{
string sfn1, sfn2, sfn;
string[] spicf;
int ipos, i, idata;
if ( !FileUpload1.HasFile )
{
TBmsg.Text = "ファイル選択なし";
return;
}
sfn1 = FileUpload1.PostedFile.FileName;
sfn2 = FileUpload1.FileName;
ipos = sfn1.IndexOf( sfn2 );
sfn1 = sfn1.Remove( ipos );
try
{
spicf = Directory.GetFiles( sfn1, "*.txt" );
}
catch
{
TBmsg.Text = String.Format( "ファイル一覧が取得できません[{0}]", sfn1 );
return;
}
i = 0;
idata = spicf.Length;
ListBox1.Items.Clear();
while( true )
{
if ( i >= idata )
{
break;
}
sfn = spicf[ i ];
i++;
ListBox1.Items.Add( sfn );
} // while( true )
ViewState[ "m_iData" ] = idata;
TBmsg.Text = String.Format( "{0} 件 画像データあり", idata );
} -
trapemiya さんからの引用 ブラウザのセキュリティ設定を確認してください。安全だとマークされていないActiveXの実行が無効になっていませんか?
普通にメモ帳で
<html>
<script language="javascript">
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("c:\\testfile.txt", true);alert( "bb" );
</script>
</html>
を実行すると情報メッセージなどができきますが、動きます。
textfileがCにできています。
-
ローカルに保存されているhtmlの実行と、Webサーバーからやってくるhtmlの実行におけるセキュリティ設定は異なります。IEのセキュリティ設定でも、インターネットゾーンと、イントラネットゾーンとでセキュリティ設定が異なることからも想像できると思います。
ところで、サーバーサイドのコードから、クライアントのファイル一覧を直接見ることはできないでしょう。もしできれば、セキュリティ上の重大な問題となります。もし、一覧を得たいのであれば、次のようにすればできるのではないかと思います。
1.サーバーサイドで得られたフォルダのパスにおけるファイル一覧を取得するjscriptを動的に生成する。
2.そのjscriptが自動的に実行され、得られたファイル一覧をhidden項目などにセットし、サブミット。
3.サーバーサイドで、hidden項目からファイル一覧を復元。もしくは、
1.document.getElementById('<%= fileUpLoad.ClientID %>').value などとして、直接jscriptでフォルダのパスを取得し、上記の2.と3.を実行しても良いかと思います。
いずれにしても、jscriptでファイル一覧を取得しておいて、サーバーサイドにそれを渡すということになるでしょう。