none
ブラウザを起動せずに「ファイルのダウンロード」ボックスを出力する方法 RRS feed

  • 質問

  • VS2010でWindows Form + ASP.netを開発中です。

    SQLServer上に保存されたバイナリオブジェクトをクライアント側に表示させることが目的です。

    クライアント側に自動でファイルを保存させることは今回は行いません。

    クライアント側のボタンイベント

    void btnPlay_Click(object sender, EventArgs e)
    {
       System.Diagnostics.Process.Start("http://url/fileflush.aspx?id=123"));
    }


    fileflush.aspxのソース

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="fileflush.aspx.cs" Inherits="WebApplication.fileflush" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body></body>
    </html>

    fileflush.aspx.cs

    public partial class fileflush : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                String id = Request.QueryString["id"];
    
                if (!string.IsNullOrEmpty(id))
                {
                    string StrConn = "connectionstring・・・";
    
                    using (SqlConnection SqlCon = new SqlConnection(StrConn))
                    {
                        using (SqlCommand SqlCmd = new SqlCommand())
                        {
                            SqlCmd.CommandText = "select * from binobj where objid=@id";
                            SqlCmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
                            SqlCmd.Connection = SqlCon;
                            SqlCon.Open();
                            SqlDataReader reader = SqlCmd.ExecuteReader();
                            reader.Read();
                            string strFile = reader["file_name"].ToString();
    
                            Response.ContentType = "application/octet-stream";
                            Response.AppendHeader("Content-Disposition", "attachment; filename=" + strFile);                        
                            Response.BinaryWrite((Byte[])reader["obj"]);
                            Response.Flush();
                            SqlCon.Close();
    
                            Response.End();
                        }
                    }                
                }
            }
        }

    上記の構成でクライアントのイベントを呼び出すと、ブラウザが起動し、真っ白なページが開いた後に「ファイルのダウンロード」ボックスが表示されます。

    「開く」を選択すると、関連付いたアプリが起動しファイルを確認できます。

    しかしながら目的はブラウザを起動せずにボックスを表示させることです。

    HTTPの基本的なことを理解していないため、どこに原因があるかが分かりません。 

    よろしくお願いします。

    2012年2月10日 9:31

回答

  • HTTP の問題ではないと思います。

    "http://~" のような URL に対して Process.Start を呼び出すと、通常は http のプロトコルに関連付けられたアプリケーションが、URL が引数となって起動します。

    この時に起動するアプリケーションは(概ねデフォルトブラウザですが)環境によってまちまちなので、空欄のブラウザが表示されることもあれば、ダウンロード用のウィンドウだけが起動する環境もあることでしょう。その時の挙動は、WinForms 側のアプリケーションを実行しているユーザが、自身の環境にどのような設定をしているかによって異なります。

    この部分の制御を行いたいのであれば、WebRequest や WebBrowser コントロール等を使って制御する必要があると思います。

    • 回答としてマーク TwSoft 2012年2月12日 23:58
    2012年2月10日 9:42
  • 自己レスです。

    フォームにWebBrowserコンポーネントを配置し、そのVisibleをFalseに設定し、Navigateメソッドを記述することで解決しました。

    this.webBrowser1.Navigate("http://url/fileflush.aspx?id=123");

    • 回答としてマーク TwSoft 2012年2月12日 23:58
    2012年2月10日 9:46

すべての返信

  • HTTP の問題ではないと思います。

    "http://~" のような URL に対して Process.Start を呼び出すと、通常は http のプロトコルに関連付けられたアプリケーションが、URL が引数となって起動します。

    この時に起動するアプリケーションは(概ねデフォルトブラウザですが)環境によってまちまちなので、空欄のブラウザが表示されることもあれば、ダウンロード用のウィンドウだけが起動する環境もあることでしょう。その時の挙動は、WinForms 側のアプリケーションを実行しているユーザが、自身の環境にどのような設定をしているかによって異なります。

    この部分の制御を行いたいのであれば、WebRequest や WebBrowser コントロール等を使って制御する必要があると思います。

    • 回答としてマーク TwSoft 2012年2月12日 23:58
    2012年2月10日 9:42
  • 自己レスです。

    フォームにWebBrowserコンポーネントを配置し、そのVisibleをFalseに設定し、Navigateメソッドを記述することで解決しました。

    this.webBrowser1.Navigate("http://url/fileflush.aspx?id=123");

    • 回答としてマーク TwSoft 2012年2月12日 23:58
    2012年2月10日 9:46