質問
現在、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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/28 02:38