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

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

新規登録して質問してみよう
ただいま回答率
85.50%
HTTPヘッダー

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

Internet Explorer 8

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

HTML

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

ASP.NET

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

VB.NET

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

Q&A

解決済

1回答

6402閲覧

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

bbs

総合スコア16

HTTPヘッダー

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

Internet Explorer 8

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

HTML

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

ASP.NET

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

VB.NET

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

0グッド

2クリップ

投稿2015/04/24 19:52

編集2015/04/25 07:14

質問

現在、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】

lang

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

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

【画面C】(download.aspx)

lang

1Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 2 Dim ReceiveDownloadURLPath As String = String.Empty 3 Try 4 ReceiveDownloadURLPath = Server.UrlDecode(Request.QueryString("DownloadPath")) 5 Response.ContentType = "application/octet-stream" 6 Response.AppendHeader("X-Download-Options", "noopen") 7 Response.AppendHeader("X-Content-Type-Options", "nosniff") 8 Response.AppendHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(Path.GetFileName(ReceiveDownloadURLPath))) 9 Response.WriteFile(ReceiveDownloadURLPath) 10 Response.Flush() 11 Response.End() 12 Finally 13 If Not String.IsNullOrEmpty(ReceiveDownloadURLPath) Then File.Delete(ReceiveDownloadURLPath) 14 End Try 15End Sub

【マスターページ(画面A,Cで使用しています)】

lang

1<%@ Master Language="VB" CodeFile="XXXXXXXX.master.vb" Inherits="XXXXXXXX" %> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio … 3<html xmlns="http://www.w3.org/1999/xhtml"> 4 <head runat="server"> 5 <meta http-equiv="X-UA-Compatible" content="IE=100" /> 6 <meta http-equiv="Expires" content="0" /> 7 </head> 8 <body> 9 <form id="form1" runat="server"> 10 <asp:ScriptManager ID="ScriptManager1" runat="server"> 11 <Scripts> 12 <asp:ScriptReference Path="~/JavaScript/Common.js?20150424" /> 13 </Scripts> 14 </asp:ScriptManager> 15 <div> 16 <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> 17 </asp:ContentPlaceHolder> 18 </div> 19 </form> 20 </body> 21</html>

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

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

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

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

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

guest

回答1

0

自己解決

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

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


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


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

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

lang

1 2 ''' <summary> 3 ''' ページロード 4 ''' </summary> 5 ''' <param name="sender"></param> 6 ''' <param name="e"></param> 7 ''' <remarks></remarks> 8 Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 9 If Not IsPostBack Then 10 ' 初期表示時 11 InitialDisplay() 12 Else 13 ' ポストバック時 14 DownloadFile() 15 End If 16 End Sub 17 18 ''' <summary> 19 ''' 初期表示時の設定を行います 20 ''' </summary> 21 ''' <remarks></remarks> 22 Private Sub InitialDisplay() 23 Dim TempPath As String = Server.UrlDecode(Request.QueryString("DownloadTempPath")) 24 Dim FileName As String = Server.UrlDecode(Request.QueryString("DownloadFileName")) 25 Dim sb As New StringBuilder 26 If File.Exists(TempPath) Then 27 HiddenField1.Value = TempPath ' ファイルPath格納 28 HiddenField2.Value = FileName ' ファイル名格納 29 sb.Append("<SCRIPT LANGUAGE='javascript'>") 30 sb.Append(" form1.submit();") ' ポストバックさせる 31 sb.Append("</SCRIPT>") 32 Page.ClientScript.RegisterStartupScript(Me.GetType(), "download", sb.ToString) 33 Else 34 sb.Append("<SCRIPT LANGUAGE='javascript'>") 35 sb.Append(" window.close();") ' 画面を閉じる 36 sb.Append("</SCRIPT>") 37 Page.ClientScript.RegisterStartupScript(Me.GetType(), "close", sb.ToString) 38 End If 39 End Sub 40 41 ''' <summary> 42 ''' ファイルをダウンロードさせます 43 ''' </summary> 44 ''' <remarks></remarks> 45 Private Sub DownloadFile() 46 Dim TempPath As String = String.Empty 47 Dim FileName As String = String.Empty 48 Try 49 TempPath = HiddenField1.Value ' ファイルPath読込 50 FileName = HiddenField2.Value ' ファイル名読込 51 Response.HeaderEncoding = System.Text.Encoding.GetEncoding("Shift-JIS") 52 Response.ContentType = "application/octet-stream" 53 Response.AppendHeader("X-Download-Options", "noopen") 54 Response.AppendHeader("X-Content-Type-Options", "nosniff") 55 Response.AppendHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(FileName)) 56 Response.WriteFile(TempPath) 57 Response.Flush() 58 Response.End() 59 Finally 60 If File.Exists(TempPath) Then Directory.Delete(Path.GetDirectoryName(TempPath), True) 61 End Try 62 End Sub 63

投稿2015/04/27 06:46

bbs

総合スコア16

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

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

bbs

2015/04/28 02:38

すみません、DownloadFile()の修正です If File.Exists(TempPath) Then Directory.Delete(Path.GetDirectoryName(TempPath), True) の箇所を If Not String.IsNullOrEmpty(TempPath) Then File.Delete(TempPath) でした。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問