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

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

ただいまの
回答率

90.60%

  • HTML

    8682questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • VB.NET

    896questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    509questions

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

  • HTTPヘッダー

    87questions

    Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

  • Internet Explorer 8

    13questions

    Windows Internet Explorer 8は、マイクロソフトによって開発されたウェブブラウザで、2009年の3月19日に、Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008、そしてWindows 7に組み込まれました。

IE8でファイルダウンロードが出来ない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,799

bbs

score 11

質問
   現在、ASP.NETにてWEBアプリケーションを開発しています。

   そこでファイルをダウンロードする機能を作成しているのですが、IE8でファイルのダウンロードが失敗します。

   「エクスポート」ボタンを押すと保存ダイアログが出てきて欲しいのですが
   IE8だけなぜか「サーバ名 - download.aspxをダウンロードできません。
   というメッセージボックスが出てきてしまいます(指定していないのに画面名のファイルをDLしようとする)

   なぜ出来ないのか教えてください。。。
   IE8~IE11で正常にダウンロードさせることは出来るのでしょうか・・?
   数日解決できず、納期が迫っているため質問させていただきます。


状況や試した事等
  ・非SSL環境です。

  ・IE10,11では問題無くファイルがダウンロードされます。

  ・IE8でも画面Aでは問題なくファイルのダウンロードが行えます。

  ・画面CのReceiveDownloadURLPathには期待通りのPATHが渡っています。

  ・そのPATH(WEBサーバ)にはファイルが存在します。(上記の確認はResponse.End()等をコメントアウトし
   download画面にTextBoxを設置してPageLoadでTextBoxに値を設定して確認しました)

  ・X-Content-Type-Optionsを追加しましたがだめでした。

  ・ContentTypeをapplication/force-downloadにしてもだめでした。

  ・症状としては「https://support.microsoft.com/en-us/kb/939251/ja」と同じだった為
   IISの設定を変更しましたが治りませんでした。

  ・ファイル名を日本語以外の半角文字にしてもだめでした。

  ・Content-Dispositionのattachment;を消してもだめでした。


怪しいと思っている箇所
  Content-Dispositionのfilenameが認識していないのがそもそもダメなんじゃないかなとは思うのですが
  IE8でそれを認識させる方法がわかりません。

環境
  【サーバ】
   .NETFramework4.0
   ASP.NET(VB.NET)
   SQLServer2008R2
   WindowsServer 2008 R2
   IIS7

  【クライアント】
   Windows7(32bit) IE10, 11
   Windows7(32bit) IE8

画面説明
   画面A:「エクスポート」ボタン押下でDBを検索
       結果をCSV変換後ファイルを作成を行い同じ画面内で
       Response.WriteFile()を行う。
       ※エクスポートの後の処理が必要ない為

   画面B:「エクスポート」ボタン押下でDBを検索
       結果をCSV変換後ファイルを作成を行い保存PATHを画面Cに渡す。
       ※エクスポートの後の処理が必要な為、ダウンロードを画面Cに託しています。

   画面C:受け取った保存PATHのファイルを使用しResponse.WriteFile()を行う。

ソースコード

【画面A】
Private Sub Export(dt As DataTable, FileName As String)
    ' dtには検索結果のデータが入っています。
    ' FineNameには「XXXX.csv」というファイル名が入っています。
    Dim TmpFilePath As String = Path.GetTempFileName
    Try
        ConvertDataTableToCsv(dt, TmpFilePath) ' DataTableの内容をCSV変換し指定した保存PATHに格納します
        Response.ContentType = "application/octet-stream"
        Response.AppendHeader("X-Download-Options", "noopen")
        Response.AppendHeader("X-Content-Type-Options", "nosniff")
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(Path.GetFileName(FileName)))
        Response.WriteFile(TmpFilePath)
        Response.Flush()
        Response.End()
    Finally
        File.Delete(TmpFilePath)
    End Try
End Sub

【画面B】
javascriptのwindow.open()で画面Cに遷移させます。
画面Cが開いて値が渡っているので割愛させて頂きます。


【画面C】(download.aspx)
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim ReceiveDownloadURLPath As String = String.Empty
    Try
        ReceiveDownloadURLPath = Server.UrlDecode(Request.QueryString("DownloadPath"))
        Response.ContentType = "application/octet-stream"
        Response.AppendHeader("X-Download-Options", "noopen")
        Response.AppendHeader("X-Content-Type-Options", "nosniff")
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(Path.GetFileName(ReceiveDownloadURLPath)))
        Response.WriteFile(ReceiveDownloadURLPath)
        Response.Flush()
        Response.End()
    Finally
        If Not String.IsNullOrEmpty(ReceiveDownloadURLPath) Then File.Delete(ReceiveDownloadURLPath)
    End Try
End Sub

【マスターページ(画面A,Cで使用しています)】
<%@ Master Language="VB" CodeFile="XXXXXXXX.master.vb" Inherits="XXXXXXXX" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="X-UA-Compatible" content="IE=100" />
        <meta http-equiv="Expires" content="0" />
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server">
                <Scripts>
                    <asp:ScriptReference Path="~/JavaScript/Common.js?20150424" />
                </Scripts>
            </asp:ScriptManager>
            <div>
                <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
                </asp:ContentPlaceHolder>
            </div>
        </form>
    </body>
</html>

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

とりあえず自己解決させて頂きます。

【画面A】のように一回画面表示された後のダウンロードは正常に行えるので
【画面C】についても同じ事をするようにしました。


【画面C】を一回表示させてから(PageLoad()を通してから)
ダウンロード処理を行うとダウンロードが出来ました。
ただし、この方法ではダウンロード画面は手動で閉じなければいけなくなりました。。


方法としては
1.画面CのPageLoad()内で値を受け取り、ファイル格納先Path等をHiddenに保持します。
2.onload時にformのsubmitを行うjavaScriptを実行します。
3.ポストバック時にダウンロードの処理を入れます。

「注意」
このソースはサンプルの為、GETでパラメータを渡しているので
URL内にWEBサーバのファイル格納先PATHが表示されてしまいます。
なので通常使用する場合はPOSTでデータを渡したほうがいいかもしれません
あと、同じ理由でHiddenに格納している部分はセッションに入れて下さい。


    ''' <summary>
    ''' ページロード
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            ' 初期表示時
            InitialDisplay()
        Else
            ' ポストバック時
            DownloadFile()
        End If
    End Sub

    ''' <summary>
    ''' 初期表示時の設定を行います
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub InitialDisplay()
        Dim TempPath As String = Server.UrlDecode(Request.QueryString("DownloadTempPath"))
        Dim FileName As String = Server.UrlDecode(Request.QueryString("DownloadFileName"))
        Dim sb As New StringBuilder
        If File.Exists(TempPath) Then
            HiddenField1.Value = TempPath   ' ファイルPath格納
            HiddenField2.Value = FileName   ' ファイル名格納
            sb.Append("<SCRIPT LANGUAGE='javascript'>")
            sb.Append("    form1.submit();") ' ポストバックさせる
            sb.Append("</SCRIPT>")
            Page.ClientScript.RegisterStartupScript(Me.GetType(), "download", sb.ToString)
        Else
            sb.Append("<SCRIPT LANGUAGE='javascript'>")
            sb.Append("    window.close();") ' 画面を閉じる
            sb.Append("</SCRIPT>")
            Page.ClientScript.RegisterStartupScript(Me.GetType(), "close", sb.ToString)
        End If
    End Sub

    ''' <summary>
    ''' ファイルをダウンロードさせます
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DownloadFile()
        Dim TempPath As String = String.Empty
        Dim FileName As String = String.Empty
        Try
            TempPath = HiddenField1.Value ' ファイルPath読込
            FileName = HiddenField2.Value ' ファイル名読込
            Response.HeaderEncoding = System.Text.Encoding.GetEncoding("Shift-JIS")
            Response.ContentType = "application/octet-stream"
            Response.AppendHeader("X-Download-Options", "noopen")
            Response.AppendHeader("X-Content-Type-Options", "nosniff")
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(FileName))
            Response.WriteFile(TempPath)
            Response.Flush()
            Response.End()
        Finally
            If File.Exists(TempPath) Then Directory.Delete(Path.GetDirectoryName(TempPath), True)
        End Try
    End Sub

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/28 11:38

    すみません、DownloadFile()の修正です

    If File.Exists(TempPath) Then Directory.Delete(Path.GetDirectoryName(TempPath), True)

    の箇所を

    If Not String.IsNullOrEmpty(TempPath) Then File.Delete(TempPath)

    でした。すみません。

    キャンセル

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

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

関連した質問

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

  • HTML

    8682questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • VB.NET

    896questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • ASP.NET

    509questions

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

  • HTTPヘッダー

    87questions

    Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

  • Internet Explorer 8

    13questions

    Windows Internet Explorer 8は、マイクロソフトによって開発されたウェブブラウザで、2009年の3月19日に、Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008、そしてWindows 7に組み込まれました。