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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

4987閲覧

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

JohnnyXU

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2019/08/06 09:37

編集2019/08/08 00:51

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(); }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/06 10:33 編集

まず何はともあれ、コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。それから、ASP.NET Web アプリの話なら ASP.NET のタグを付けてください。 質問文から推察するに質問者さんにはほとんど Web アプリ開発の知識はないようで、話が通じないように思いますが・・・ 「ブラウザで名前を付けて保存」というのは ASP.NET Web アプリから送信されてくる何らかのデータをブラウザ側でファイルとして保存するということで良いのですか? とするとそのファイルはどういう形式にするのですか? アップされていたコードからすると、名前一覧のテキストファイルのように見えますが、それで良いのですか? ASP.NET Web Forms ですか、MVC ですか? それともそれ以外? そのあたりの情報を書いてください。 対象とするブラウザは何ですか? alg さんの回答にある通り、どのブラウザを使おうとブラウザでは SaveFileDialog を出すのは不可能です。IE で言うと通知―バーは出せますが、それで良いのですか?
JohnnyXU

2019/08/07 04:49

Visual Studio 2015でASP.NETのサイトを作成して、開発しています。 一つ画面しかないです。 開発終わった後、AWS EC2にDeployします。 別のサイトからHome画面を開いて、Postされて来たデータを受け取ります。 Webブラウザ画面の「ダウンロード」ボタンを押下し、ダイアログを表示され、パスとファイル名を選択して、 ダイアログの【確定】ボタン押下、受け取ったデータでAWS RDSからデータを抽出して、指定されたファイルにデータを書き込みします。
退会済みユーザー

退会済みユーザー

2019/08/07 05:33

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

退会済みユーザー

2019/08/07 06:59

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

回答2

0

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/06 10:05

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JohnnyXU

2019/08/07 04:50

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

0

ベストアンサー

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

(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 02:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JohnnyXU

2019/08/07 04:50

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

2019/08/08 07: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();
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問