質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

C#ブラウザで「名前を付けて保存」ダイアログ

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,851

score 7

C#ブラウザで名前を付けて保存のソース

Visual Studio 2015
Home.aspx
Home.aspx.cs

Visual Studio 2015でASP.NETのサイトを作成して、開発しています。
一つ画面しかないです。開発終わった後、AWS EC2にDeployします。

別のサイトのボタンを押下し、ブラウザーの新しいタブを立ち上げ、Postされて来たデータを受け取理、Home画面を表示されます。
Webブラウザ画面の「ダウンロード」ボタンを押下し、ダイアログを表示され、パスとファイル名を選択/入力して、
ダイアログの【確定/OK】ボタン押下、受け取ったデータ(キー)でAWS RDSからデータを抽出して、
指定されたファイルにデータを入れ、クライアント側にexcel/csvファイルを生成します。

ダイアログ部分のソース:調査中

AWS RDSからデータの抽出: 完了

var pkFile = new PrivateKeyFile(@"C:xxxx.pem", "");
                var connBuilder = new MySqlConnectionStringBuilder
                {
                    AllowBatch = true,
                    Server = "127.0.0.1",
                    Port = 3306,
                    UserID = "xxxxx",
                    Password = "xxxxx",
                    Database = "xxxxx"
                };
                using (var client = new SshClient("xxx.xxx.xxx.xxx", 22, "xxx", pkFile))
                {
                    client.Connect();
                    var forward = new ForwardedPortLocal("127.0.0.1", 3306, "xxxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com", 3306);
                    client.AddForwardedPort(forward);
                    forward.Start();

                    var sql = "SELECT xxxx FROM  xxxx LEFT JOIN XXXX ON XXX WHERE ";

using (var connection = new MySqlConnection(connBuilder.ConnectionString))
                    {
                        connection.Open();
                        using (var com = new MySqlCommand(sql, connection))
                        {
                            com.CommandType = CommandType.Text;
                            var ds = new DataSet();
                            var da = new MySqlDataAdapter(com);
                            da.Fill(ds);
                            foreach (DataRow drow in ds.Tables[0].Rows)
                            {
                                UserName.Text = drow["lastname"].ToString() + " " + drow["firstname"].ToString() + "様";
                            }
                        }
                        connection.Close();
                        forward.Stop();
                    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/08/06 19:29 編集

    まず何はともあれ、コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。それから、ASP.NET Web アプリの話なら ASP.NET のタグを付けてください。

    質問文から推察するに質問者さんにはほとんど Web アプリ開発の知識はないようで、話が通じないように思いますが・・・

    「ブラウザで名前を付けて保存」というのは ASP.NET Web アプリから送信されてくる何らかのデータをブラウザ側でファイルとして保存するということで良いのですか? とするとそのファイルはどういう形式にするのですか? アップされていたコードからすると、名前一覧のテキストファイルのように見えますが、それで良いのですか?

    ASP.NET Web Forms ですか、MVC ですか? それともそれ以外? そのあたりの情報を書いてください。

    対象とするブラウザは何ですか? alg さんの回答にある通り、どのブラウザを使おうとブラウザでは SaveFileDialog を出すのは不可能です。IE で言うと通知―バーは出せますが、それで良いのですか?

    キャンセル

  • JohnnyXU

    2019/08/07 13:49

    Visual Studio 2015でASP.NETのサイトを作成して、開発しています。
    一つ画面しかないです。
    開発終わった後、AWS EC2にDeployします。

    別のサイトからHome画面を開いて、Postされて来たデータを受け取ります。
    Webブラウザ画面の「ダウンロード」ボタンを押下し、ダイアログを表示され、パスとファイル名を選択して、
    ダイアログの【確定】ボタン押下、受け取ったデータでAWS RDSからデータを抽出して、指定されたファイルにデータを書き込みします。

    キャンセル

  • SurferOnWww

    2019/08/07 14:33

    まず何はともあれ、コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。それから、ASP.NET Web アプリの話なら ASP.NET のタグを付けてください。

    頼んだことをやってください。

    キャンセル

  • SurferOnWww

    2019/08/07 15:59

    C# のタグは消す必要はないと思います。(C# と ASP.NET のタグ両方付けるのがよさそうです)

    キャンセル

回答 2

+2

Home.aspx とあるので、ASP.NET のプロジェクトを作っているものと思います。
一方、SaveFileDialog はWindowsフォームで使うものです。
ASP.NET と Windowsフォーム は別のものなので、今のプロジェクトでは SaveFileDialog は使えません。そのため、

Visual Stuidoのツールボックスに「SaveFileDialog」で検索しても何も出てこないです。

ということになっています。


必ず「名前をつけて保存」させたいのでしたら、レスポンスのヘッダーに Content-Disposition: attachment を追加するとよいのではないでしょうか。

以下、参考情報です。

Content-Disposition - HTTP | MDN
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition

ASP.NETでダウンロードダイアログを表示してダウンロードさせる - Kobarin's Development Blog
http://kobarin.hateblo.jp/entry/20110428/1303964262

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/07 13:50

    ありがとうございます。
    試してみます。

    キャンセル

checkベストアンサー

+1

質問者さんが上の質問へのコメントに無反応ですが、このまま終わってしまっては何なので、以下の条件で情報提供しておきます。

(1) 「ブラウザで名前を付けて保存」というのは ASP.NET Web アプリから送信されてくる何らかのデータをブラウザ側でファイルとして保存するということ。

(2) ファイルの形式は、アップされていたコードから想像して、名前一覧のテキストファイル。

(3) ASP.NET Web Forms アプリ。

(4) 対象とするブラウザにはファイル名の文字化けの問題がある IE を含む。

(5) どのブラウザを使おうとブラウザでは SaveFileDialog を出すのは不可能。代わりに、IE で言う通知バー相当のものを出す。

以上の条件であれば、以下の記事のコードの応用でできると思います。

ダウンロードは HTTP ハンドラで
http://surferonwww.info/BlogEngine/post/2013/02/16/use-http-handler-for-downloading-files.aspx

上の記事のコードは "Hello World" という文字列を、"日本語.txt" という名前のテキストファイルとしてダウンロードさせています。

質問者さんのコードで UserName.Text にダウンロードさせたい文字列が取得できていると想像していますが、そうであれば紹介した記事のコードの response.Write("Hello World"); を response.Write(UserName.Text); に変更すればよさそうです。

質問にあった「ダイアログの【確定】ボタン押下」で window.open を使って HTTP ハンドラを呼び出せばダウンロードが始まります。

なお、そうするためには「AWS RDSからデータを抽出」(質問にある ADO.NET のコードと理解)の実行は HTTP ハンドラ内で行う必要があります。もし、「AWS RDSからデータを抽出」を【確定】ボタンのあるページで行う必要があれば、クエリ文字列または Session を使って UserName.Text の文字列を HTTP ハンドラに渡すことを検討してください。

紹介した記事では、IE の日本語のファイル名の文字化け対策として、ブラウザが IE と判定されたらファイル名を UrlEncode するようにしていますが、IE9 より RFC 6266 (RFC 2231/RFC 5987) がサポートされたということで今はそちらで対処するのがお勧めです。

ブラウザによってファイルの種類を判断する方法が異なるのにも注意が必要です。コードのコメントにある通り、Content-Disposition ヘッダと Content-Type ヘッダの両方を正しく指定してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/07 13:50

    ありがとうございます。
    試してみます。

    キャンセル

  • 2019/08/08 16:00 編集

    解決できました、ありがとうございました。

    string fileName = "xxx.csv";
    var csvData = new StringBuilder();

    // AWS RDS data
    foreach (DataRow drow in ds.Tables[0].Rows)
    {
    csvData.Append(drow["lastname"].ToString() + " " + drow["firstname"].ToString() + "様");
    ほかの項目追加,,,,
    }

    Response.ContentType = "application/download";
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
    Response.AppendHeader("Content-Disposition", "Attachment; filename=" + HttpUtility.UrlEncode(fileName));
    Response.Write(csvData.ToString());
    Response.End();

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る