2010-12-04 26 views
7

サーバーにJSONデータを送信しています。サーバーはPDFファイルを生成し、そのPDFファイルへのURLで応答します。次に、PDFファイルをダウンロードするためにサーバーに別の要求を行います。ダウンロードを行うには、非表示のiFrameを作成し、ソースにPDFのURLを設定します。ユーザーのブラウザを同じページに置き、バックグラウンドでダウンロードしたいと考えています。私がやっていることと私が行った解決策の詳細はthis SO questionにあります。iframe経由でファイルをダウンロードする際にChromeエラーが発生しました

この方法をChromeで使用するときは、すべてうまく動作します。しかし、クローム開発者コンソールを見ると、エラーメッセージFailed to load resourceが表示されます。 私はこれらのエラーを取得しないようにこれを別の方法で行う方法はありますか?

非常にシンプルで機能しているexample of the problem in actionがjsfiddleで確認できます。 [PDFをダウンロード]ボタンをクリックしてChromeコンソールをご覧ください。

、そのページ上のコードは次のようになります

$(document).ready(function() { 
    var downloadFile = function(url){ 
     var iframe = $("iframe#download"); 
     if (!iframe.length) { 
      iframe = $("<iframe id='download' style='display:none;'/>"); 
      $("body").append(iframe); 
     } 
     iframe.attr("src", url); 
    }; 

    $("button").click(function() {  
     downloadFile("http://www.education.gov.yk.ca/pdf/pdf-test.pdf"); 
    }); 
}); 
+2

「display:none;」を取り除くと、それは私のためにMac用のChrome Stableで動作します。 Chromeには、組み込みのPDFビューアを使用してPDFを開こうとしていることが関係していると思います。たぶん、応答のコンテンツタイプをapplication/pdfからapplication/octet-streamに変更して、通常のファイルとして扱い、ダウンロードするようにしてみてください。 –

答えて

4

他の回答者も同様にうまくいくはずですが、ブラウザーに対処方法を指示する特定の応答ヘッダーがあります。ファイル。

次は、ダウンロードしたのではなく、ブラウザに表示されるPDFファイルを強制する必要があります。

の「Content-処分:添付ファイル;ファイル名= [ファイル名]」

+0

ありがとうございます。私は戻って確認する必要がありますが、私はすでにこれをやっていると信じています。 – Tauren

+0

何らかの理由で、私が以前に使っていた技術が、ダウンロードがSafariで正常に機能していたにもかかわらず、Chromeでのダウンロードの一部が機能しなくなりました。この変更は、先週、またはそれ以降に起こったことがあります。おそらく、最新のChromeバージョンで何かが変更されましたか?とにかく、私はすべてのコンテンツの処分を設定していないことに気がつきました。追加したら、Chromeでのダウンロードが再開されました。前にコンテンツタイプを設定していましたが、その処理を追加すると違いが生じました。だから私は答えとしてこの解決策をマークしています。 – Tauren

+1

ちょうど私が私をつかまえたつかみを言いたいと思った。ヘッダの 'attachment'部分が 'filename'部分の前に来るようにしてください。 filename = wibble.txtではなく、 'filename = wibble.txt'アタッチメント ' –

-2

がdocument.readyの外であなたの関数を移動...

一般的な機能は、常に外にする必要があります...そしてそれwhereeverと呼ばれるべき

$(document).ready(function() {  

    $("button").click(function() {  
     downloadFile("http://www.education.gov.yk.ca/pdf/pdf-test.pdf"); 
    }); 
}); 

    var downloadFile = function(url){ 
      var iframe = $("iframe#download"); 
      if (!iframe.length) { 
       iframe = $("<iframe id='download' style='display:none;'/>"); 
       $("body").append(iframe); 
      } 
      iframe.attr("src", url); 
     }; 
+0

ありがとう、私のアプリで私はすでにこれを行う。私の例は、問題を説明するためにちょうど迅速かつ汚れていました。しかし、あなたの答えは私の質問には全く言及していません。私がChromeで 'リソースを読み込めませんでした 'というエラーメッセージが表示される理由は何ですか? – Tauren

+0

JSFiddlerのボタンをクリックすると、ページのすべての要素が小さくなるように見えます(Chrome 8.0.552.215にあります)。それ以外にも、なぜdocument.readyからこの関数を削除するのか説明できますか?編集:ボタンのクリック後にChromeのズームが100%から34%に設定されているためにページが縮小されています。 – Steven

+0

そうです、@ shambleh。それは非常に奇妙です。私はそのズームの変化を引き起こしているのだろうか。それにもかかわらず、私はまだ 'ready()'から関数を移動した後、 'リソースを読み込めませんでした'エラーを見ています。ここにjsfiddleのアップデート版があります:http://jsfiddle.net/94WvR/3/関数の場所がどういう意味か分かりません。 – Tauren

0

を必要とされている私は自分自身のWebサーバー上の1つに、ファイルのSRCを変更し、「アプリケーション/オクテットストリーム」の代わりに「APPLICにレスポンスヘッダの「コンテンツタイプ」を設定しますation/pdf "をダウンロードし、Chromeで正しくダウンロードしました。私はエラーがまだコンソールに表示されていることを指摘しておきますが( "Error loading resource")、ファイルをダウンロードするよう促しました。

2

これは私の頭の一番上にあります。以前は同じ問題にぶつかってきたと思います。 iframeがdomに最初に追加されると、srcはありません。これにより、Chromeは「FAIL TO LOAD RESOURCE」になります。インラインフレームに初期SRCを追加

TRY -

iframe = $("<iframe id='download' src='about:blank' style='display:none;'/>"); 

私は信じてそれを行う必要があります。 (間違っていると何百回も私にdownvoteすることができます:))

+0

ところで、あなたのjsfiddleリンクを見てみましたが、コンソールにエラーは表示されませんでした。10.0.648.204を使用していますか? – ansiart

+0

「src」を含めることをお勧めします。私は現在OSXで10.0.648.204を使用していますが、私がこの質問を投稿したとき、私は最も早く何かを使っていました。私が以前に指摘したテストPDFファイルは200 OKになりますが、内容は空です。おそらくjsfiddleを実際のPDFファイルを指し示すように変更して、それがどのように動作するかをダウンロードして見てください。 – Tauren

+0

まだエラーが表示されていますか?私は、新しいバージョンのChromeでは空のiframeにエラーが表示されないと思っています – ansiart

2

Chromeが組み込まれているPDFビューア。 iframeのsrcを設定すると、ChromeはPDFファイルを表示しようとします。 display:noneに設定されているため、ダウンロードがキャンセルされ、そのメッセージが表示されます。

displaynone以外に設定して、position:absoluteでiframeを画面から外します。

0
var downloadFile = function(url){ 
    var iframe = $("iframe#download"); 
    if (!iframe.length) { 
     iframe = $("<iframe id='download' style='display:none;'/>"); 
     $("body").append(iframe); 
    } 
    iframe.attr("src", url); 
    iframe.on('load',function(){ 
      console.log("error") 
    }); 
}; 

Uはただ、これを試すことが取り組んでいる、しかし、これは、この問題を解決する正しい方法ではありません...

関連する問題