2009-05-07 14 views
5

次のユースケースに対して、クロスブラウザソリューションが必要です。 ユーザーが私たちのページの「エクスポート」ボタンをクリックすると、フォームでポップアップが開きます。フォームを送信すると、ユーザーはバイナリファイルのダウンロード(たとえばCSVファイル)を受け取り、親ウィンドウの表示内容を変更せずにポップアップを閉じる必要があります。ポップアップで閉じる(IEとFirefoxで)バイナリファイルをダウンロードするには?

タイムアウトを使用してポップアップを閉じることはできません。通常、ファイルをダウンロードする前にユーザーにファイルを処理する方法を尋ねるダイアログがあります。このダイアログを処理する時間を知る方法はありません。

元は、ポップアップにwindow.locationをダウンロードファイルURLに設定するスクリプトがありました。そのため、ポップアップは閉じられません。

親ウィンドウに隠れたiFrameを置いて、ポップアップにiFrameのsrcをダウンロードURLに設定してからself.close()を呼び出すようにしました。それはFirefoxで完全に動作しますが、IEはセキュリティ制限で完全にそれを悪用します。

これを行う正しい方法はありますか? IEで動作する方法はどうですか?


アップデート - 問題は、ここで提案答えはあまりにも遠くありませんでしたが、私の問題だけでJavascriptの問題であることよりも少し複雑だった

を解決しました。 IEとExcelでバグが発生しました(ダウンロードファイルはCSVです)、ポップアップはフォームポストを行っていました。

フォームデータをURL(POSTではなくGET)に追加せずに問題を解決できず、IEで信頼できるサイトとして設定する必要があります(これはエンタープライズアプリケーションなので、合理的ですユーザーの作成要求)。

フォームボタンをクリックすると、ポップアップがwindow.openerの関数を呼び出し、フォームとそのアクションURLを渡します。次にポップアップはwindow.close()を呼び出します。この関数はフォームデータをURLに追加し、window.locationを新しいURLに設定します(iFrameのアイデアはIEではうまく機能せず、明らかに必要ではありませんでした)。

フォームURLへの応答では、要求ヘッダーにはContent-Type:application/octetstreamとContent-Disposition "、" attachment "が含まれます。ファイル名= filename.csv」。

+0

オリジナルのページにフォームを置くか、新しいページをiframeで開きます(スクリプト自体から生成される可能性があります)。 – Anonymous

+0

Anonymousへの返信 - あなたが何を記述しているかは、私がやったことのようなものだと思います。ポップアップは、作成および初期ロード時に、実際には目に見えないiFrameを親ページに書き込みます。フォームがポップアップで送信されると、ダウンロードファイルをロードするようにiFrameに指示します。私のIE(IE 6)はこれをブロックし、親ウィンドウでダウンロードを確認するように強制しました。確認時に、親ウィンドウフォームを再送信しようとします。これにより、もう1つの確認ダイアログが表示され、通常は上書きされます。 –

+0

私はiframeにフォームを提出することを考えていました。これは、ポップアップ問題が解消されています。 – Anonymous

答えて

0

これは問題にアプローチする方法かもしれない。

1をonSubmitは、その空白のページでページを開きます第三のウィンドウにwindow.openを行います)ポップアップフォームダウンロードしたファイルを返します。

2)ポップアップフォーム上のあなたのJavaScriptでは、あなたがwindow.openを行う権利た後、あなたの親ウィンドウ(第一画面)のポップアップフォームを送信閉じメソッドを呼び出します。

3)ファイルを返すページである3番目のページでは、ヘッダーファイル内のcontent-dispositionを使用してファイルとnothを返すだけですそれ以外の場合は、ページは実際に開かれません。

必要なヘッダーに関する情報があります。コードは古典的な先史時代のASPにありますが、必要なものを拾うことができます。

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

お役に立てば幸いです。

+0

ポップアップのフォーム提出が実際にダウンロードするファイルを生成して名前を付けるので、ステップ1が私の場合にはうまくいかないかどうかはわかりません。この提出の結果が得られるまでは、私はダウンロードURLを知らないので、第3のウィンドウを開くことができません。これは解決可能な問題ですが、開発サイクルの後半にバグが修正されているため、ファイルダウンロードサーブレット自体に触れないようにしたいと考えていました。 –

1

iframeソリューションで実際にiframeの位置を設定する親ウィンドウ内でメソッドを呼び出そうとしましたか?

親ウィンドウ

<html> 
<head> 
<script type="text/javascript"> 
var w; 

var download = function() { 
    document.frames[0].location = "test.php"; 
    w.close(); 
}; 

var o = function() { 
    w = window.open("test2.html", "window_name"); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return o();">open</a> 

<iframe></iframe> 

</body> 
</html> 

ポップアップウィンドウ

<html> 
<head> 
<script type="text/javascript"> 
var download = function() { 
    window.opener.download(); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return download();">download</a> 

</body> 
</html> 

test.phpをは、ファイルを強制的にちょうどページです:それは私のテストで働いていたので、私は聞いていますのよ上記のコードはIE固有のものですが、document.framesオブジェクトを使用していますが、クロスブラウザで簡単に作成できることに注意してください。

+0

親ページの生成時には、ファイルのダウンロードURLはわかりません。 download()関数に渡すことができると思います。私はこれを試さなければならないでしょう(私のスケジュールのため、来週早々に)。 –

+0

オープナーにdownload()関数を置いても問題は解決されませんでした。 IEはまだダウンロードプロセスをブロックし、完全にマングルします。私の次のステップは、ポップアップではなくフォームをiFrameに読み込むことです。 –

+0

IEのどのバージョンですか? –

-1

完璧な解決策はありません。 IEのファイルをポップアップしてFirefoxで直接ダウンロードした場合、

関連する問題