IE10での「をダウンロードできませんでした。」の問題ですが無事解決しました。

※サンプルあり、多分IE11も同様の対応でOKだと思います

 

昔作成したプログラムでファイルダウンロードが失敗すると連絡を受けて調査しました。

開発環境で再現させてみても全く問題なしで再現しません・・・

20150303_DownloadErr

サーバー環境が原因か?
それともクライアント環境が原因?

ググってみても「これだ」と思う原因は無し。

そうなるとローラー作戦で調査するしかない。
プログラムがバグってると仮定して、
色々なダウンロードファイルを用意してテスト。
そうすると、法則が見えてきましたよ。

ファイルサイズでね。
どうも、ある一定のファイルサイズを超えると<「ファイル」をダウンロードできませんでした。>が表示される。

そうなれば、あとはググって問題解決へ一直線。

【原因】
要約するとIE10以降色々な処理が非同期になってる。
なので、ファイルサイズが小さい場合、非同期の処理(ダウンロード完了画面)までに本当にダウンロード完了となっている。
ファイルサイズが大きい場合、非同期の処理(ダウンロード完了画面)が始まり、ダウンロードが打ち切られる。
上記原因で<「ファイル」をダウンロードできませんでした。>が表示される。

【対応方法】
対応は、2案ある
1案目:「Response」でファイルサイズを記載する(メソッド忘れた)
2案目:「Response.Close()」を「Response.End()」に変更する

【2案目サンプル】
<修正前>
With Response
.ContentType = “application/octet-stream”
.AddHeader(“Cache-Control”, “public”)
.AddHeader(“Pragma”, “public”)
.AddHeader(“Content-Disposition”, “attachment; filename=” + ファイル名)
.WriteFile(パス名)
.Flush()
.Close()
End With

<修正後>
With Response
.ContentType = “application/octet-stream”
.AddHeader(“Cache-Control”, “public”)
.AddHeader(“Pragma”, “public”)
.AddHeader(“Content-Disposition”, “attachment; filename=” + ファイル名)
.WriteFile(パス名)
.Flush()
.End()
End With

2案目を採用して問題解決!!
無事ファイルをダウンロードできました。
もちろん、中身もOKでしたよ。