2017-04-21 11 views
0

$_POST変数を使用してPDFファイルをダウンロードするPHPスクリプトがあります。このスクリプトは、ブラウザでファイルを読み込むのではなく、ダウンロードしてファイルとして返すように設定されていますまたはファイルをサーバーに保存します。jQuery PDFダウンロード - お待ちください。

このファイルをシンプルな形式でダウンロードできますが、問題はまったくありませんが、処理時間が約5~10秒であるため、jQueryにclickイベントを処理させて、処理が完了すると、スクリプトが処理されている間に「お待ちください」というメッセージが表示され、処理が完了すると「ファイルのダウンロードが開始されました」というメッセージが表示されます。

clickには「しばらくお待ちください」というメッセージが表示されますが、ページの処理が完了した時点を特定できないため、PDFをダウンロードしても「しばらくお待ちください」というメッセージが表示されます。

私はpreventDefaultを使用して、ajaxclickイベントとPOSTデータを処理するためのjQueryを使用している場合は、私が手に正しい「待って」とメッセージ「開始のダウンロード」が、ブラウザにファイルのダウンロードを返すことができません。

preventDefaultを使用しないで一時的に両方の方法を組み込んでいますが、これはユーザーには正しい動作です。ファイルのダウンロードが開始されるまで「しばらくお待ちください」と表示され、実際にダウンロードを開始します。しかし、私は確信しているので、これは実際にデータを2回転記しています.1回はformで、もう1回はjQueryで、要求を完了するのに同じ時間がかかるので、私が望む機能が達成されます。

私が適切にしたいことを達成する方法はありますか?

jQueryのを "作業" HTMLフォーム$filenameがデータベース呼び出しからである)

<form method="post" action="pdf/index.php" name="pdfForm" id="pdfForm"> 
<button type="submit" class="downloadButton" 
name="filename" value="'.$filename.'">'.$filename.'</button> 
</form> 

(申し訳ありませんが、私が試した他のバージョンからいくつかの冗長性がある)

<script> 
    $(document).ready(function() { 
    $('.downloadButton').on('click', function(e) { 
     //e.preventDefault(); // File will not download if this is not commented out 
     var $filename = $(this).val(); 
     var $thisBox = $(this); 
     var $url = $('#pdfForm').attr('action'); 
     $thisBox.text("Please Wait"); 
     url = $url; 
     return $.post(url, {filename: $filename}) 
     .done(function(data) { 
      $thisBox.text("File Download has started"); 
      // This won't happen unless e.preventDefault() is excluded 
     }); 

    }); 
    }); 
</script> 

私は解決策を望む他にも何も質問しなかったが、私にはうってつけのものは何も見つかりませんでした。私が得た最も近いものはajaxblobでしたが、古いブラウザーのサポートが必要で、結果はあまり大きくありませんでした。

何か助けていただければ幸いです。私はちょうど何かが明らかに欠けていて、今はそれをずっと見ていることができません。

答えて

1

私は言葉に同じ問題を抱えていました。私は解決策を見つけました。たぶんあなたはpdfのために修正するべきではないかもしれません。

//When click... 
//For browers doesn't support the download attribut.... 
//The only issue is to past by a popup with the GET method 
a = document.createElement('a'); 
if(typeof a.download =="undefined") { 
    win = window.open('your_url?data=data','_blank','height=200,width=200,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); 
    var loop = setInterval(function() { 
     if(win.closed) { 
      clearInterval(loop); 
      //Hide your modal or clean your innerhtml here 
     } 
    }, 1000); 
    return(false); 
}else{ 
    // Use XMLHttpRequest 
    xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     var a; 
     if (xhttp.readyState === 4 && xhttp.status === 200) { 
      a.href = window.URL.createObjectURL(xhttp.response); 
      a.download = "name_file"; 
      a.style.display = 'none'; 
      document.body.appendChild(a); 
      a.click(); 
     } 
    }; 
    xhttp.open("POST", 'your_url'); 
    xhttp.setRequestHeader("Connection", "close"); 
    xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    // For a word I must return a 'blob' because it's a binary. Maybe you should change it 
    xhttp.responseType = 'blob'; 
    xhttp.send(JSON.stringify(your_data)); 
    xhttp.addEventListener('readystatechange', function() { 
     if (xhttp.readyState === XMLHttpRequest.DONE) { 
      //Hide your modal, or clean your innerhtml here 
     } 
    }); 
} 
関連する問題