none
クライアント側のファイル一覧の表示 RRS feed

  • 質問

  • 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  )
             
        }

     

    これでは、サーバー側の一覧がリストに入ってしまいます。

    クライアント側の一覧をリストに表示させることは、できますか?

     

    2007年3月7日 1:45

回答

  • ローカルに保存されているhtmlの実行と、Webサーバーからやってくるhtmlの実行におけるセキュリティ設定は異なります。IEのセキュリティ設定でも、インターネットゾーンと、イントラネットゾーンとでセキュリティ設定が異なることからも想像できると思います。

    ところで、サーバーサイドのコードから、クライアントのファイル一覧を直接見ることはできないでしょう。もしできれば、セキュリティ上の重大な問題となります。もし、一覧を得たいのであれば、次のようにすればできるのではないかと思います。

    1.サーバーサイドで得られたフォルダのパスにおけるファイル一覧を取得するjscriptを動的に生成する。
    2.そのjscriptが自動的に実行され、得られたファイル一覧をhidden項目などにセットし、サブミット。
    3.サーバーサイドで、hidden項目からファイル一覧を復元。

    もしくは、

    1.document.getElementById('<%= fileUpLoad.ClientID %>').value などとして、直接jscriptでフォルダのパスを取得し、上記の2.と3.を実行しても良いかと思います。

    いずれにしても、jscriptでファイル一覧を取得しておいて、サーバーサイドにそれを渡すということになるでしょう。

    2007年3月10日 5:24
    モデレータ

すべての返信

  • > クライアント側の一覧をリストに表示させることは、できますか?

    ASP.NETのプログラムは「どこで」動作しているのかじっくり考えてみましょう。

     

    2007年3月7日 2:02
  • >ASP.NETのプログラムは「どこで」動作しているのかじっくり考えてみましょう。

    サーバー側で、動作していると思いますが、なにか?

     

     

    2007年3月7日 8:32
  •  丸中太郎 さんからの引用
    >ASP.NETのプログラムは「どこで」動作しているのかじっくり考えてみましょう。

    サーバー側で、動作していると思いますが、なにか?

    では、クライアント側の情報を、ASP.NET でどのように取れるとお考えですか?

    2007年3月7日 10:31
  • http://support.microsoft.com/kb/300982/ja

    を参考にしてください。ファイルシステムオブジェクトの.GetFolder()でファイルの一覧を列挙できます

    http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/oct04/hey1020.mspx

    も参考になります。

    2007年3月8日 2:17
  • 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枚決定。それをサーバー側に保管するのをつくろうとしています。

     

    2007年3月10日 0:27
  • ブラウザのセキュリティ設定を確認してください。安全だとマークされていないActiveXの実行が無効になっていませんか?

    FileSystemObjectはセキュリティ設定の絡みがあります。今回の目的であれば、FileUploadコントロールが使えませんか?

    2007年3月10日 2:21
    モデレータ
  • そうなのです。私も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  );
           
        }

    2007年3月10日 4:14
  •  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にできています。

     

    2007年3月10日 4:36
  • ローカルに保存されているhtmlの実行と、Webサーバーからやってくるhtmlの実行におけるセキュリティ設定は異なります。IEのセキュリティ設定でも、インターネットゾーンと、イントラネットゾーンとでセキュリティ設定が異なることからも想像できると思います。

    ところで、サーバーサイドのコードから、クライアントのファイル一覧を直接見ることはできないでしょう。もしできれば、セキュリティ上の重大な問題となります。もし、一覧を得たいのであれば、次のようにすればできるのではないかと思います。

    1.サーバーサイドで得られたフォルダのパスにおけるファイル一覧を取得するjscriptを動的に生成する。
    2.そのjscriptが自動的に実行され、得られたファイル一覧をhidden項目などにセットし、サブミット。
    3.サーバーサイドで、hidden項目からファイル一覧を復元。

    もしくは、

    1.document.getElementById('<%= fileUpLoad.ClientID %>').value などとして、直接jscriptでフォルダのパスを取得し、上記の2.と3.を実行しても良いかと思います。

    いずれにしても、jscriptでファイル一覧を取得しておいて、サーバーサイドにそれを渡すということになるでしょう。

    2007年3月10日 5:24
    モデレータ