ব্রাউজার কখন ফাইল ডাউনলোড পায় তা সনাক্ত করুন


487

আমার একটি পৃষ্ঠা রয়েছে যা ব্যবহারকারীকে গতিময় উত্পন্ন ফাইল ডাউনলোড করতে দেয়। এটি উত্পন্ন করতে দীর্ঘ সময় নেয়, সুতরাং আমি একটি "অপেক্ষার" সূচকটি দেখাতে চাই। সমস্যাটি হ'ল, ব্রাউজারটি কখন ফাইলটি পেয়েছে তা কীভাবে সনাক্ত করব তা আমি বুঝতে পারি না, তাই আমি সূচকটি আড়াল করতে পারি।

আমি একটি গোপন আকারে অনুরোধ করছি, যা সার্ভারে পোস্ট করে এবং এর ফলাফলের জন্য একটি লুকানো আইফ্রেমকে লক্ষ্য করে। এটি তাই আমি ফলাফল সহ পুরো ব্রাউজার উইন্ডো প্রতিস্থাপন না। ডাউনলোডটি সম্পূর্ণ হওয়ার পরে এটি চালু হবে এই আশায় আমি ইফ্রামে একটি "লোড" ইভেন্টের জন্য শুনি।

আমি ফাইলটির সাথে একটি "বিষয়বস্তু-বিভাজন: সংযুক্তি" শিরোনামটি ফিরিয়ে দিই, যার ফলে ব্রাউজারটি "সংরক্ষণ করুন" ডায়ালগটি দেখায়। তবে ব্রাউজারটি যদি ইফ্রেমে কোনও "লোড" ইভেন্ট চালায় না।

আমি চেষ্টা করেছি এমন একটি পদ্ধতির মধ্যে বহু অংশের প্রতিক্রিয়া ব্যবহার করা। সুতরাং এটি একটি খালি HTML ফাইল, পাশাপাশি সংযুক্ত ডাউনলোডযোগ্য ফাইল প্রেরণ করবে would উদাহরণ স্বরূপ:

Content-type: multipart/x-mixed-replace;boundary="abcde"

--abcde
Content-type: text/html

--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf

file-content
--abcde

এটি ফায়ারফক্সে কাজ করে; এটি খালি এইচটিএমএল ফাইল গ্রহণ করে, "লোড" ইভেন্টটিকে গুলি করে, তারপরে ডাউনলোডযোগ্য ফাইলের জন্য "সংরক্ষণ করুন" ডায়ালগটি দেখায়। তবে এটি IE এবং সাফারিতে ব্যর্থ হয়; IE "লোড" ইভেন্টটিকে আগুন ধরিয়ে দেয় তবে ফাইলটি ডাউনলোড করে না, এবং সাফারি ফাইলটি ডাউনলোড করে (ভুল নাম এবং বিষয়বস্তুর ধরণ সহ), এবং "লোড" ইভেন্টটিকে আগুন দেয় না।

ফাইল তৈরি শুরু করার জন্য একটি কল করার জন্য একটি ভিন্ন পদ্ধতি হতে পারে, তারপরে এটি প্রস্তুত না হওয়া পর্যন্ত সার্ভারটি পোল করুন, তারপরে ইতিমধ্যে তৈরি ফাইলটি ডাউনলোড করুন। তবে আমি সার্ভারে অস্থায়ী ফাইল তৈরি করা এড়াতে চাই।

কারও কি আরও ভাল ধারণা আছে?


4
IE এর কোনও সংস্করণ মাল্টিপার্ট / এক্স-মিশ্রিত-প্রতিস্থাপন সমর্থন করে না।
এরিকলও

ধন্যবাদ এরিক - এটি জানা ভাল। এই পদ্ধতির সাথে আমি আর কোনও সময় নষ্ট করব না।
জেডাব্লু

কেবল নির্ভরযোগ্য উপায়টি সার্ভার পুশ বিজ্ঞপ্তি বলে মনে হচ্ছে (ASP.NET ভাবেনদের জন্য সিগন্যালআর)।
dudeNumber4

1
bennadel.com/blog/… - এটি একটি সহজ সমাধান
মাতেন

1
@ মেটেন ধন্যবাদ ড্যুড! এটি সত্যিই সহজ
ফাই জাল ডং

উত্তর:


451

একটি সম্ভাব্য সমাধান ক্লায়েন্টের জাভাস্ক্রিপ্ট ব্যবহার করে।

ক্লায়েন্ট অ্যালগরিদম:

  1. একটি এলোমেলো অনন্য টোকেন উত্পন্ন করুন।
  2. ডাউনলোডের অনুরোধ জমা দিন এবং একটি জিইটি / পোষ্ট ক্ষেত্রে টোকেনটি অন্তর্ভুক্ত করুন।
  3. "অপেক্ষমান" সূচকটি দেখান।
  4. একটি টাইমার শুরু করুন, এবং প্রতি সেকেন্ড বা তারপরে, "ফাইলডাউনলোডটোকেন" (বা আপনি যা সিদ্ধান্ত নিন) নামে একটি কুকি সন্ধান করুন।
  5. যদি কুকি বিদ্যমান থাকে এবং এর মান টোকেনের সাথে মিলে যায় তবে "অপেক্ষার" সূচকটি লুকান।

সার্ভার অ্যালগরিদম:

  1. অনুরোধে জিইটি / পোষ্ট ক্ষেত্রটি সন্ধান করুন।
  2. যদি এর একটি খালি শুল্ক মান থাকে তবে একটি কুকি (যেমন "ফাইলডাউনলোডটোকেন") ড্রপ করুন এবং তার মানটি টোকেনের মানকে সেট করুন।

ক্লায়েন্ট উত্স কোড (জাভাস্ক্রিপ্ট):

function getCookie( name ) {
  var parts = document.cookie.split(name + "=");
  if (parts.length == 2) return parts.pop().split(";").shift();
}

function expireCookie( cName ) {
    document.cookie = 
        encodeURIComponent(cName) + "=deleted; expires=" + new Date( 0 ).toUTCString();
}

function setCursor( docStyle, buttonStyle ) {
    document.getElementById( "doc" ).style.cursor = docStyle;
    document.getElementById( "button-id" ).style.cursor = buttonStyle;
}

function setFormToken() {
    var downloadToken = new Date().getTime();
    document.getElementById( "downloadToken" ).value = downloadToken;
    return downloadToken;
}

var downloadTimer;
var attempts = 30;

// Prevents double-submits by waiting for a cookie from the server.
function blockResubmit() {
    var downloadToken = setFormToken();
    setCursor( "wait", "wait" );

    downloadTimer = window.setInterval( function() {
        var token = getCookie( "downloadToken" );

        if( (token == downloadToken) || (attempts == 0) ) {
            unblockSubmit();
        }

        attempts--;
    }, 1000 );
}

function unblockSubmit() {
  setCursor( "auto", "pointer" );
  window.clearInterval( downloadTimer );
  expireCookie( "downloadToken" );
  attempts = 30;
}

সার্ভার কোড উদাহরণ (পিএইচপি):

$TOKEN = "downloadToken";

// Sets a cookie so that when the download begins the browser can
// unblock the submit button (thus helping to prevent multiple clicks).
// The false parameter allows the cookie to be exposed to JavaScript.
$this->setCookieToken( $TOKEN, $_GET[ $TOKEN ], false );

$result = $this->sendFile();

কোথায়:

public function setCookieToken(
    $cookieName, $cookieValue, $httpOnly = true, $secure = false ) {

    // See: http://stackoverflow.com/a/1459794/59087
    // See: http://shiflett.org/blog/2006/mar/server-name-versus-http-host
    // See: http://stackoverflow.com/a/3290474/59087
    setcookie(
        $cookieName,
        $cookieValue,
        2147483647,            // expires January 1, 2038
        "/",                   // your path
        $_SERVER["HTTP_HOST"], // your domain
        $secure,               // Use true over HTTPS
        $httpOnly              // Set true for $AUTH_COOKIE_NAME
    );
}

4
দুর্দান্ত ধারণা, আমি jQuery / সি # দিয়ে একাধিক ফাইল ডাউনলোড করার বিষয়ে এই উত্তরের একটি মৌলিক কাঠামো হিসাবে ব্যবহার করেছি
গ্রেগ

7
অন্যদের জন্য শিরোনাম: যদি ডকুমেন্ট.কুকিতে ডাউনলোডটোকেন অন্তর্ভুক্ত না থাকে তবে কুকির পথটি পরীক্ষা করুন check আমার ক্ষেত্রে, সার্ভার সাইডে "/" -র পথটি সেট করতে হয়েছিল (যেমন জাভাতে ڪوڪي.setPath ("/")) যদিও ডিফল্টরূপে ফাঁকা ছিল। কিছু সময়ের জন্য আমি ভেবেছিলাম যে সমস্যাটি বিশেষ 'লোকালহোস্ট' ডোমেন কুকি হ্যান্ডলিং ( স্ট্যাকওভারফ্লো.com / উকশনস / ১১৩৪২৯৯০/… ) তবে শেষ পর্যন্ত সমস্যাটি ছিল না। অন্যদের জন্য এটি এতটা পড়ার মতো মূল্যবান হতে পারে।
jlpp

2
আপনার সমাধানটি আরও গভীরতার দিকে যাওয়ার আগে @ বিদ্রোহী, আমি ভাবছি এটি ক্রস ডোমেন ফাইল ডাউনলোডের অনুরোধের সাথে কাজ করে কিনা। আপনি কি ভাবেন যে এটি হবে, বা কুকিজ বিধিনিষেধগুলি এটির সাথে আপস করবে?
kiks73

5
উজ্জ্বল - এটি আমার কাছে 100 বছরের মধ্যে ঘটেনি যে আপনি কোনও ফাইল ডাউনলোডের অংশ হিসাবে কুকিজ অন্তর্ভুক্ত করতে পারেন। ধন্যবাদ!!
ফ্রিফালার

8
অন্যরা যেমন উল্লেখ করেছে, এই সমাধানটি সমস্যার কিছু অংশ সমাধান করে, সার্ভারের জন্য ফাইলের সময় প্রস্তুত হওয়ার অপেক্ষায়। সমস্যার অন্য অংশটি, যা ফাইলের আকার এবং সংযোগের গতির উপর নির্ভর করে যথেষ্ট হতে পারে, এটি ক্লায়েন্টের কাছে পুরো ফাইলটি পেতে আসলে কতক্ষণ সময় নেয়। এবং যে এই সমাধান সঙ্গে সমাধান করা হয় না।
AsGoodAsItGates

27

window.onblur()লোডিং ডায়ালগটি বন্ধ করতে ইভেন্টটি ব্যবহার করা একটি খুব সাধারণ (এবং খোঁড়া) এক লাইন সমাধান । অবশ্যই, যদি এটি খুব বেশি সময় নেয় এবং ব্যবহারকারী অন্য কিছু করার সিদ্ধান্ত নেন (ইমেলগুলি পড়ার মতো) লোডিং ডায়ালগটি বন্ধ হয়ে যাবে।


এটি একটি সহজ পদ্ধতির যা কোনও ফাইল ডাউনলোডের জন্য লোডিং ওভারলে থেকে মুক্তি পাওয়ার জন্য আদর্শ যা onbeforeunloadআপনাকে ধন্যবাদ ব্যবহার করে ট্রিগার করা হয়েছিল ।
wf4

5
এটি সমস্ত ব্রাউজারগুলিতে কাজ করে না (কিছু ডাউনলোড ওয়ার্কফ্লো যেমন, সাফারি, কিছু আইআই সংস্করণ ইত্যাদি) হিসাবে বর্তমান উইন্ডোটি ঝাপসা / ঝাপসা ছেড়ে দেয় না)।
হিটপট

4
ক্রোম এবং অন্যান্য ব্রাউজারগুলি এই শর্তটি ব্যর্থ হবে এমন ফাইলগুলিকে স্বয়ংক্রিয়ভাবে ডাউনলোড করে।
ভাগ্যবান

@ লাকি যা কেবলমাত্র ডিফল্টরূপে। এটি সম্পূর্ণরূপে সম্ভব যে ক্রোমের একজন ব্যবহারকারী ডাউনলোডগুলি কোথায় সংরক্ষণ করতে হবে তা নির্দিষ্ট করে এবং তাই ডায়ালগ বাক্সটি দেখুন
ESR

2
খারাপ ধারণা কারণ আপনি ট্যাবচেঞ্জের উপর অস্পষ্টতা বা উইন্ডোর বাইরে কোনও ক্রিয়াকলাপ সক্রিয় করেছেন
মাইকেল

14

পুরানো থ্রেড, আমি জানি ...

তবে সেগুলি, এখানে গুগল দ্বারা নেতৃত্ব দেওয়া আমার সমাধানে আগ্রহী হতে পারে। এটি খুব সহজ, এখনও নির্ভরযোগ্য। এবং এটি বাস্তব অগ্রগতি বার্তাগুলি প্রদর্শিত সম্ভব করে তোলে (এবং সহজেই বিদ্যমান প্রক্রিয়াগুলিতে প্লাগ ইন করা যায়):

যে স্ক্রিপ্টটি প্রক্রিয়া করে (আমার সমস্যাটি ছিল: HTTP- র মাধ্যমে ফাইলগুলি পুনরুদ্ধার করা এবং তাদের জিপ হিসাবে বিতরণ করা) সেশনটিতে স্থিতি লিখেছে।

স্থিতিটি প্রতি সেকেন্ডে পোলড এবং প্রদর্শিত হয়। সমস্ত কিছু ঠিক আছে (ঠিক আছে, এটি নয় you আপনাকে প্রচুর বিবরণ [যেমন সমবর্তী ডাউনলোডগুলি] র যত্ন নিতে হবে তবে এটি শুরু করার জন্য একটি ভাল জায়গা ;-))।

ডাউনলোডপেজ:

    <a href="download.php?id=1" class="download">DOWNLOAD 1</a>
    <a href="download.php?id=2" class="download">DOWNLOAD 2</a>
    ...
    <div id="wait">
    Please wait...
    <div id="statusmessage"></div>
    </div>
    <script>
//this is jquery
    $('a.download').each(function()
       {
        $(this).click(
             function(){
               $('#statusmessage').html('prepare loading...');
               $('#wait').show();
               setTimeout('getstatus()', 1000);
             }
          );
        });
    });
    function getstatus(){
      $.ajax({
          url: "/getstatus.php",
          type: "POST",
          dataType: 'json',
          success: function(data) {
            $('#statusmessage').html(data.message);
            if(data.status=="pending")
              setTimeout('getstatus()', 1000);
            else
              $('#wait').hide();
          }
      });
    }
    </script>

getstatus.php

<?php
session_start();
echo json_encode($_SESSION['downloadstatus']);
?>

download.php

    <?php
    session_start();
    $processing=true;
    while($processing){
      $_SESSION['downloadstatus']=array("status"=>"pending","message"=>"Processing".$someinfo);
      session_write_close();
      $processing=do_what_has_2Bdone();
      session_start();
    }
      $_SESSION['downloadstatus']=array("status"=>"finished","message"=>"Done");
//and spit the generated file to the browser
    ?>

3
তবে যদি ব্যবহারকারী একাধিক উইন্ডোজ বা ডাউনলোডগুলি খোলা থাকে? এছাড়াও আপনি এখানে সার্ভারে একটি নিরর্থক কল পেতে পারেন
ইউকী

3
আপনার যদি একটি ব্যবহারকারীর একাধিক সংযোগ থাকে তবে তারা সমস্ত অন্যান্য সংযোগ শেষ হওয়ার অপেক্ষায় থাকবে কারণ সেশন_স্টার্ট () ব্যবহারকারীর জন্য সেশন লক করে এবং অন্যান্য অ্যাক্সেসটিকে অ্যাক্সেস করতে বাধা দেয়।
হনজা কুচাř

2
.each()ইভেন্ট নিবন্ধগুলির জন্য আপনাকে ব্যবহার করার দরকার নেই। শুধু বলুন$('a.download').click()
রোবসারব

ভিতরে কোড eval করবেন না setTimeout('getstatus()', 1000);। সরাসরি fn ব্যবহার করুন:setTimeout(getstatus, 1000);
রোকো সি বুলজান

11

আমি ব্লবগুলি ডাউনলোড করতে এবং ডাউনলোডের পরে অবজেক্ট-ইউআরএল প্রত্যাহার করতে নিম্নলিখিতটি ব্যবহার করি। এটি ক্রোম এবং ফায়ারফক্সে কাজ করে!

function download(blob){
    var url = URL.createObjectURL(blob);
    console.log('create ' + url);

    window.addEventListener('focus', window_focus, false);
    function window_focus(){
        window.removeEventListener('focus', window_focus, false);                   
        URL.revokeObjectURL(url);
        console.log('revoke ' + url);
    }
    location.href = url;
}

ফাইল ডাউনলোড ডায়লগ বন্ধ হওয়ার পরে, উইন্ডোটি তার ফোকাসটি ফিরে পায় যাতে ফোকাস ইভেন্টটি ট্রিগার হয়।


এখনও উইন্ডো স্যুইচ করার এবং ফিরে আসার বিষয়টি রয়েছে যা মডেলটি আড়াল করার কারণ হবে।
dudeNumber4

9
নীচের ট্রেতে ডাউনলোড করা ক্রোমের মতো ব্রাউজারগুলি উইন্ডোটি কখনই ঝাপসা / পুনরায় ফোকাস করে না।
কোলেম্যান

10

এলমার উদাহরণের ভিত্তিতে আমি আমার নিজস্ব সমাধান প্রস্তুত করেছি। উপাদানগুলি সংজ্ঞায়িত ডাউনলোড শ্রেণীর সাথে ক্লিক করার পরে এটি স্ক্রিনে কাস্টম বার্তা প্রদর্শন করতে দেয়। আমি বার্তাটি লুকানোর জন্য ফোকাস ট্রিগার ব্যবহার করেছি ।

জাভাস্ক্রিপ্ট

$(function(){$('.download').click(function() { ShowDownloadMessage(); }); })

function ShowDownloadMessage()
{
     $('#message-text').text('your report is creating, please wait...');
     $('#message').show();
     window.addEventListener('focus', HideDownloadMessage, false);
}

function HideDownloadMessage(){
    window.removeEventListener('focus', HideDownloadMessage, false);                   
    $('#message').hide();
}

এইচটিএমএল

<div id="message" style="display: none">
    <div id="message-screen-mask" class="ui-widget-overlay ui-front"></div>
    <div id="message-text" class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-front ui-draggable ui-resizable waitmessage">please wait...</div>
</div>

ডাউনলোডের জন্য এখন আপনার যে কোনও উপাদান প্রয়োগ করা উচিত:

<a class="download" href="file://www.ocelot.com.pl/prepare-report">Download report</a>

অথবা

<input class="download" type="submit" value="Download" name="actionType">

প্রতিটি ডাউনলোড ক্লিকের পরে আপনি আপনার প্রতিবেদন তৈরির বার্তা দেখতে পাবেন , দয়া করে অপেক্ষা করুন ...


2
যদি ব্যবহারকারী উইন্ডোটি ক্লিক করেন?
টম রোগেরো

এই ঠিক আমি যা খুঁজছিলাম ছিল, অনেক ধন্যবাদ !!
সার্জিও

আমার ক্ষেত্রে আড়াল () বলা হচ্ছে না
প্রশান্ত পিম্পলে

8

আমি একটি সাধারণ জাভাস্ক্রিপ্ট ক্লাস লিখেছিলাম যা বুলেটরিয়াস উত্তরে বর্ণিত অনুরূপ একটি কৌশল প্রয়োগ করে । আমি আশা করি এটি এখানে কারও পক্ষে উপকারী হতে পারে। গিটহাব প্রকল্পটি ডাকা হয় প্রতিক্রিয়া-মনিটর.জেএস

ডিফল্টরূপে এটি স্পিন.জেএস ব্যবহার করে ওয়েটিং ইন্ডিকেটর হিসাবে তবে এটি কাস্টম ইনডিকেটর প্রয়োগের জন্য কলব্যাকের একটি সেটও সরবরাহ করে।

জিকিউরি সমর্থিত তবে প্রয়োজনীয় নয়।

উল্লেখযোগ্য বৈশিষ্ট্য

  • সাধারণ সংহতকরণ
  • কোনও নির্ভরতা নেই
  • জিকুয়েরি প্লাগ-ইন (alচ্ছিক)
  • Spin.js ইন্টিগ্রেশন (alচ্ছিক)
  • ইভেন্টগুলি পর্যবেক্ষণের জন্য কনফিগারযোগ্য কলব্যাক
  • একসাথে একাধিক অনুরোধগুলি পরিচালনা করে
  • সার্ভার-সাইড ত্রুটি সনাক্তকরণ
  • সময়সীমা সনাক্তকরণ
  • ক্রস ব্রাউজার

ব্যবহারের উদাহরণ

এইচটিএমএল

<!-- the response monitor implementation -->
<script src="response-monitor.js"></script>

<!-- optional JQuery plug-in -->
<script src="response-monitor.jquery.js"></script> 

<a class="my_anchors" href="/report?criteria1=a&criteria2=b#30">Link 1 (Timeout: 30s)</a>
<a class="my_anchors" href="/report?criteria1=b&criteria2=d#10">Link 2 (Timeout: 10s)</a>

<form id="my_form" method="POST">
    <input type="text" name="criteria1">
    <input type="text" name="criteria2">
    <input type="submit" value="Download Report">
</form>

ক্লায়েন্ট (সরল জাভাস্ক্রিপ্ট)

//registering multiple anchors at once
var my_anchors = document.getElementsByClassName('my_anchors');
ResponseMonitor.register(my_anchors); //clicking on the links initiates monitoring

//registering a single form
var my_form = document.getElementById('my_form');
ResponseMonitor.register(my_form); //the submit event will be intercepted and monitored

ক্লায়েন্ট (জ্যাকুয়ারি)

$('.my_anchors').ResponseMonitor();
$('#my_form').ResponseMonitor({timeout: 20});

কলব্যাক্স সহ ক্লায়েন্ট (জ্যাকুয়ারি)

//when options are defined, the default spin.js integration is bypassed
var options = {
    onRequest: function(token){
        $('#cookie').html(token);
        $('#outcome').html('');
        $('#duration').html(''); 
    },
    onMonitor: function(countdown){
        $('#duration').html(countdown); 
    },
    onResponse: function(status){
        $('#outcome').html(status==1?'success':'failure');
    },
    onTimeout: function(){
        $('#outcome').html('timeout');
    }
};

//monitor all anchors in the document
$('a').ResponseMonitor(options);

সার্ভার (পিএইচপি)

$cookiePrefix = 'response-monitor'; //must match the one set on the client options
$tokenValue = $_GET[$cookiePrefix];
$cookieName = $cookiePrefix.'_'.$tokenValue; //ex: response-monitor_1419642741528

//this value is passed to the client through the ResponseMonitor.onResponse callback
$cookieValue = 1; //for ex, "1" can interpret as success and "0" as failure

setcookie(
    $cookieName,
    $cookieValue,
    time()+300,            // expire in 5 minutes
    "/",
    $_SERVER["HTTP_HOST"],
    true,
    false
);

header('Content-Type: text/plain');
header("Content-Disposition: attachment; filename=\"Response.txt\"");

sleep(5); //simulate whatever delays the response
print_r($_REQUEST); //dump the request in the text file

আরও উদাহরণের জন্য সংগ্রহস্থলের উদাহরণ ফোল্ডারটি পরীক্ষা করুন ।


5

আমি পার্টিতে খুব দেরি করেছি তবে অন্য কেউ যদি আমার সমাধান জানতে চান তবে আমি এটি এখানে রাখব:

আমার এই সঠিক সমস্যাটির সাথে আমার সত্যিকারের লড়াই ছিল তবে আমি ইফ্রেমেস ব্যবহার করে একটি কার্যকর সমাধান পেয়েছি (আমি জানি, আমি জানি। এটি ভয়ঙ্কর তবে এটি আমার একটি সাধারণ সমস্যার জন্য কাজ করে)

আমার একটি এইচটিএমএল পৃষ্ঠা ছিল যা একটি পৃথক পিএইচপি স্ক্রিপ্ট চালু করেছিল যা ফাইল উত্পন্ন করে এবং পরে এটি ডাউনলোড করে। এইচটিএমএল পৃষ্ঠায়, আমি এইচটিএমএল শিরোনামে নিম্নলিখিত jquery ব্যবহার করেছি (আপনার পাশাপাশি একটি jquery লাইব্রেরি অন্তর্ভুক্ত করতে হবে):

<script>
    $(function(){
        var iframe = $("<iframe>", {name: 'iframe', id: 'iframe',}).appendTo("body").hide();
        $('#click').on('click', function(){
            $('#iframe').attr('src', 'your_download_script.php');
        });
        $('iframe').load(function(){
            $('#iframe').attr('src', 'your_download_script.php?download=yes'); <!--on first iframe load, run script again but download file instead-->
            $('#iframe').unbind(); <!--unbinds the iframe. Helps prevent against infinite recursion if the script returns valid html (such as echoing out exceptions) -->
        });
    });
</script>

আপনার_ডাউনলোড_স্ক্রিপ্ট.পিএফ-তে, নিম্নলিখিতগুলি রাখুন:

function downloadFile($file_path) {
    if (file_exists($file_path)) {
        header('Content-Description: File Transfer');
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment; filename=' . basename($file_path));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file_path));
        ob_clean();
        flush();
        readfile($file_path);
        exit();
    }
}


$_SESSION['your_file'] = path_to_file; //this is just how I chose to store the filepath

if (isset($_REQUEST['download']) && $_REQUEST['download'] == 'yes') {
    downloadFile($_SESSION['your_file']);
} else {
    *execute logic to create the file*
}

এটি ভেঙে ফেলার জন্য, jquery প্রথমে আপনার পিএইচপি স্ক্রিপ্টটি একটি আইফ্রেমে চালু করে। ফাইল তৈরি হওয়ার পরে iframe লোড করা হয়। তারপরে jquery স্ক্রিপ্টটি ফাইলটি ডাউনলোড করতে বলার অনুরোধের সাথে আবার স্ক্রিপ্ট চালু করে।

পিএইচপি শিরোলেখ () ফাংশনের কারণে আপনি একসাথে ডাউনলোড এবং ফাইল জেনারেশন সব করতে না পারার কারণ। আপনি যদি শিরোনাম () ব্যবহার করেন, আপনি স্ক্রিপ্টটি কোনও ওয়েব পৃষ্ঠা ব্যতীত অন্য কোনও কিছুতে পরিবর্তন করছেন এবং jquery ডাউনলোড স্ক্রিপ্টটিকে 'লোড' বলে স্বীকৃতি দেবে না। আমি জানি যে কোনও ব্রাউজার কোনও ফাইল পেলে সম্ভবত এটি সনাক্ত করা উচিত নয় তবে আপনার সমস্যাটি আমার মতো।


5

আপনি যদি কোনও ফাইল স্ট্রিমিং করে থাকেন যা আপনি গতিশীলভাবে তৈরি করছেন এবং আপনার রিয়েলটাইম সার্ভার-টু-ক্লায়েন্ট মেসেজিং লাইব্রেরি প্রয়োগ করা হয়েছে, আপনি আপনার ক্লায়েন্টকে খুব সহজে সতর্ক করতে পারেন।

সার্ভার-থেকে-ক্লায়েন্ট মেসেজিং লাইব্রেরিটি আমি পছন্দ করি এবং এটি সুপারিশ করি সকেট.ইও (নোড.জেএসের মাধ্যমে)। আপনার সার্ভার স্ক্রিপ্ট ফাইলটি উত্পন্ন করার পরে সেই স্ক্রিপ্টটিতে আপনার শেষ লাইনটি ডাউনলোড করার জন্য প্রবাহিত হচ্ছে সকেট.ইওকে একটি বার্তা প্রেরণ করতে পারে যা ক্লায়েন্টকে একটি বিজ্ঞপ্তি প্রেরণ করে। ক্লায়েন্টে, সকেট.ইও সার্ভার থেকে নির্গত আগত বার্তাগুলির জন্য শোনেন এবং আপনাকে সেগুলিতে কাজ করার অনুমতি দেয়। অন্যদের উপর এই পদ্ধতিটি ব্যবহারের সুবিধা হ'ল স্ট্রিমিং শেষ হওয়ার পরে আপনি "সত্য" সমাপ্তির ইভেন্টটি সনাক্ত করতে সক্ষম হন।

উদাহরণস্বরূপ, ডাউনলোড লিঙ্ক ক্লিক হওয়ার পরে আপনি আপনার ব্যস্ত সূচকটি প্রদর্শন করতে পারেন, আপনার ফাইলটি প্রবাহিত করতে পারেন, আপনার স্ট্রিমিংয়ের স্ক্রিপ্টের শেষ লাইনে সার্ভার থেকে সকেট.ইওকে একটি বার্তা প্রেরণ করতে পারেন, বিজ্ঞপ্তির জন্য ক্লায়েন্টের কাছে শুনুন, বিজ্ঞপ্তিটি পাবেন এবং ব্যস্ত সূচকটি লুকিয়ে রেখে আপনার UI আপডেট করুন।

আমি বুঝতে পেরেছি যে এই প্রশ্নের উত্তর পড়া বেশিরভাগ লোকের কাছে এই ধরণের সেটআপ নাও থাকতে পারে, তবে আমি নিজের প্রকল্পগুলিতে দুর্দান্ত প্রভাবের জন্য এই সঠিক সমাধানটি ব্যবহার করেছি এবং এটি আশ্চর্যরকমভাবে কাজ করে।

Socket.io ইনস্টল এবং ব্যবহার করা অবিশ্বাস্যভাবে সহজ। আরও দেখুন: http://sket.io/


5

"ব্রাউজার যখন ফাইল ডাউনলোড পান তখন কীভাবে সনাক্ত করবেন?"
আমি সেই কনফিগারেশনের সাথে একই সমস্যার মুখোমুখি হয়েছি:
স্ট্রट्स 1.2.9
jquery-1.3.2।
jquery-ui-1.7.1.custom
IE 11
java 5


একটি কুকির সাথে আমার সমাধান:
- ক্লায়েন্ট পক্ষ:
আপনার ফর্মটি জমা দেওয়ার সময়, আপনার পৃষ্ঠাটি আড়াল করতে এবং আপনার অপেক্ষার স্পিনার লোড করার জন্য আপনার জাভাস্ক্রিপ্ট ফাংশনটিতে কল করুন

function loadWaitingSpinner(){
... hide your page and show your spinner ...
}

তারপরে, একটি ফাংশন কল করুন যা প্রতি 500 মিমি সার্ভার থেকে কোনও কুকি আসছে কিনা তা পরীক্ষা করবে।

function checkCookie(){
    var verif = setInterval(isWaitingCookie,500,verif);
}

যদি কুকি পাওয়া যায় তবে প্রতি 500 মিমি যাচাই করা বন্ধ করুন, কুকির মেয়াদ শেষ হয়ে যান এবং আপনার ফাংশনটি আপনার পৃষ্ঠায় ফিরে আসতে এবং অপেক্ষার স্পিনারকে মুছে ফেলার ( রিমোট ওয়েটিংস্পিনার () ) সরাতে বলুন । আপনি যদি আবার অন্য কোনও ফাইল ডাউনলোড করতে সক্ষম হতে চান তবে কুকির মেয়াদ শেষ হওয়া গুরুত্বপূর্ণ!

function isWaitingCookie(verif){
    var loadState = getCookie("waitingCookie");
    if (loadState == "done"){
        clearInterval(verif);
        document.cookie = "attenteCookie=done; expires=Tue, 31 Dec 1985 21:00:00 UTC;";
        removeWaitingSpinner();
    }
}
    function getCookie(cookieName){
        var name = cookieName + "=";
        var cookies = document.cookie
        var cs = cookies.split(';');
        for (var i = 0; i < cs.length; i++){
            var c = cs[i];
            while(c.charAt(0) == ' ') {
                c = c.substring(1);
            }
            if (c.indexOf(name) == 0){
                return c.substring(name.length, c.length);
            }
        }
        return "";
    }
function removeWaitingSpinner(){
... come back to your page and remove your spinner ...
}

- সার্ভারের দিক:
আপনার সার্ভার প্রক্রিয়া শেষে, প্রতিক্রিয়াতে একটি কুকি যুক্ত করুন। যখন আপনার ফাইল ডাউনলোডের জন্য প্রস্তুত হবে তখন সেই কুকি ক্লায়েন্টকে পাঠানো হবে।

Cookie waitCookie = new Cookie("waitingCookie", "done");
response.addCookie(waitCookie);

আমি কাউকে সাহায্য আশা করি!


এটি পুরোপুরি কাজ করে। এই সুন্দর নমুনার জন্য ধন্যবাদ।
সেদাত কুমকু

4

যখন ব্যবহারকারী ফাইলটির প্রজন্মকে ট্রিগার করে, আপনি কেবল সেই "ডাউনলোড" এ অনন্য আইডি নির্ধারণ করতে পারেন এবং ব্যবহারকারীকে এমন একটি পৃষ্ঠায় প্রেরণ করতে পারেন যা প্রতি কয়েক সেকেন্ডে রিফ্রেশ করে (বা এজেএক্সের সাথে চেক করে)। ফাইলটি শেষ হয়ে গেলে, এটি একই অনন্য আইডির অধীনে সংরক্ষণ করুন এবং ...

  • ফাইলটি প্রস্তুত থাকলে ডাউনলোডটি করুন।
  • যদি ফাইল প্রস্তুত না হয় তবে অগ্রগতিটি দেখান।

তারপরে আপনি পুরো আইফ্রেমে / ওয়েটিং / ব্রাউজার উইন্ডো জগাখিচুড়ি এড়িয়ে যেতে পারেন, তবুও সত্যিই মার্জিত সমাধান রয়েছে have


এটি উপরে বর্ণিত অস্থায়ী-ফাইল পদ্ধতির মত শোনাচ্ছে। আমার ধারণাটি অসম্ভব হয়ে উঠলে আমি এটির মতো কিছু করতে পারি তবে আমি এটি এড়াতে আশা করি।
জেডাব্লু

3

আপনি যদি সার্ভারে ফাইলটি তৈরি ও সঞ্চয় করতে না চান, আপনি কি স্ট্যাটাসটি সংরক্ষণ করতে ইচ্ছুক, যেমন ফাইল-ইন-প্রগতি, ফাইল-সম্পূর্ণ? আপনার "অপেক্ষার" পৃষ্ঠাটি ফাইল জেনারেশনটি কখন সম্পূর্ণ হবে তা জানতে সার্ভারটিকে পোল করতে পারে। আপনি নিশ্চিতভাবে জানতেন না যে ব্রাউজারটি ডাউনলোড শুরু করেছে তবে আপনার কিছুটা আস্থা থাকবে।


2

আমি ঠিক এই একই সমস্যা ছিল। আমার সমাধানটি হ'ল অস্থায়ী ফাইলগুলি ব্যবহার করা যেহেতু আমি ইতিমধ্যে বেশ কয়েকটি অস্থায়ী ফাইল তৈরি করছি। ফর্মটি এখানে জমা দেওয়া হয়েছে:

var microBox = {
    show : function(content) {
        $(document.body).append('<div id="microBox_overlay"></div><div id="microBox_window"><div id="microBox_frame"><div id="microBox">' +
        content + '</div></div></div>');
        return $('#microBox_overlay');
    },

    close : function() {
        $('#microBox_overlay').remove();
        $('#microBox_window').remove();
    }
};

$.fn.bgForm = function(content, callback) {
    // Create an iframe as target of form submit
    var id = 'bgForm' + (new Date().getTime());
    var $iframe = $('<iframe id="' + id + '" name="' + id + '" style="display: none;" src="about:blank"></iframe>')
        .appendTo(document.body);
    var $form = this;
    // Submittal to an iframe target prevents page refresh
    $form.attr('target', id);
    // The first load event is called when about:blank is loaded
    $iframe.one('load', function() {
        // Attach listener to load events that occur after successful form submittal
        $iframe.load(function() {
            microBox.close();
            if (typeof(callback) == 'function') {
                var iframe = $iframe[0];
                var doc = iframe.contentWindow.document;
                var data = doc.body.innerHTML;
                callback(data);
            }
        });
    });

    this.submit(function() {
        microBox.show(content);
    });

    return this;
};

$('#myForm').bgForm('Please wait...');

স্ক্রিপ্টের শেষে যা আমার কাছে ফাইল তৈরি করে:

header('Refresh: 0;url=fetch.php?token=' . $token);
echo '<html></html>';

এটি iframe এ থাকা লোড ইভেন্টটিকে বহিস্কার করবে। তারপরে অপেক্ষা বার্তাটি বন্ধ হয়ে যাবে এবং ফাইল ডাউনলোড শুরু হবে then আই 7 এবং ফায়ারফক্সে পরীক্ষিত।


2

আমার অভিজ্ঞতায়, এটি পরিচালনা করার দুটি উপায় রয়েছে:

  1. ডাউনলোডে একটি স্বল্প-কালীন কুকি সেট করুন এবং জাভাস্ক্রিপ্ট ক্রমাগত এর অস্তিত্বের জন্য চেক করুন। কেবল আসল সমস্যাটি কুকির আজীবন সঠিকভাবেই পাচ্ছে - খুব সংক্ষিপ্ত এবং জেএস এটি মিস করতে পারে খুব দীর্ঘ এবং এটি অন্যান্য ডাউনলোডের জন্য ডাউনলোডের পর্দা বাতিল করতে পারে। আবিষ্কারের পরে কুকি অপসারণ করতে জেএস ব্যবহার করা সাধারণত এটি ঠিক করে দেয়।
  2. ফেচ / এক্সএইচআর ব্যবহার করে ফাইলটি ডাউনলোড করুন। ফাইল ডাউনলোড শেষ হয়ে গেলে আপনি ঠিক জানেন না, আপনি যদি এক্সএইচআর ব্যবহার করেন তবে আপনি একটি অগ্রগতি বার দেখানোর জন্য অগ্রগতি ইভেন্টগুলি ব্যবহার করতে পারেন! IE / Edge- তে MSSaveBlob এবং ফায়ারফক্স / ক্রোমে একটি ডাউনলোড লিঙ্ক ( এটির মতো ) দিয়ে ফলাফল ব্লব সংরক্ষণ করুন । এই পদ্ধতির সমস্যাটি হ'ল আইওএস সাফারি ব্লবগুলি ডাউনলোড করা ঠিকঠাকভাবে পরিচালনা করবে বলে মনে হচ্ছে না - আপনি এই ব্লবটি কোনও ফাইলরেডারের সাহায্যে একটি ডেটা ইউআরএল রূপান্তর করতে পারেন এবং এটি একটি নতুন উইন্ডোতে খুলতে পারেন, তবে এটি ফাইলটি খুলছে, এটি সংরক্ষণ করে না।

2

শুভেচ্ছা, আমি জানি যে বিষয়টি পুরানো তবে আমি এমন একটি সমাধান রেখেছি যা আমি অন্য কোথাও দেখেছি এবং এটি কার্যকর হয়েছে:

/**
 *  download file, show modal
 *
 * @param uri link
 * @param name file name
 */
function downloadURI(uri, name) {
// <------------------------------------------       Do someting (show loading)
    fetch(uri)
        .then(resp => resp.blob())
        .then(blob => {
            const url = window.URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.style.display = 'none';
            a.href = url;
            // the filename you want
            a.download = name;
            document.body.appendChild(a);
            a.click();
            window.URL.revokeObjectURL(url);
            // <----------------------------------------  Detect here (hide loading)
            alert('File detected'));
        })
        .catch(() => alert('An error sorry'));
}

তুমি এটা ব্যবহার করতে পারো:

downloadURI("www.linkToFile.com", "file.name");

1

যদি আপনার কাছে কোনও ফাইল ডাউনলোড করা থাকে যা ডকুমেন্টে থাকার বিপরীতে সংরক্ষণ করা হয় তবে ডাউনলোডটি কখন সম্পূর্ণ হবে তা নির্ধারণের কোনও উপায় নেই, কারণ এটি বর্তমান নথির পরিধিতে নয়, তবে ব্রাউজারে একটি পৃথক প্রক্রিয়া রয়েছে।


8
আমার স্পষ্ট করা উচিত - ডাউনলোডটি শেষ হওয়ার সাথে আমি খুব বেশি উদ্বিগ্ন নই the ডাউনলোডটি কখন শুরু হবে তা আমি কেবল যদি সনাক্ত করতে পারি তবে তা যথেষ্ট হবে
জে ডাব্লু।

0

ফাইলটি উত্পন্ন হওয়ার সময় একটি 'অপেক্ষার' নির্দেশক থাকা এবং তারপরে ফাইলটি ডাউনলোড করার পরে স্বাভাবিক অবস্থায় ফিরে আসার প্রশ্নটি। আমি যেভাবে টুডো পছন্দ করি তা হ'ল একটি লুকানো আইফ্রেম ব্যবহার করা হয় এবং ডাউনলোড শুরু হওয়ার সাথে সাথে আমার পৃষ্ঠাগুলিকে জানাতে ফ্রেমের অনলোড ইভেন্টটি হুক করে। ফাইল ডাউনলোডের জন্য বুট অনলোড লোড হয় না (যেমন সংযুক্তি শিরোনাম টোকেন সহ)। সার্ভারে পোলিং কাজ করে তবে আমি অতিরিক্ত জটিলতা পছন্দ করি না। তাই আমি এখানে যা করছি:

  • যথারীতি লুকানো আইফ্রেমকে লক্ষ্য করুন।
  • সামগ্রী তৈরি করুন। 2 মিনিটের মধ্যে একেবারে সময়সীমা নিয়ে ক্যাশে দিন।
  • একটি জাভাস্ক্রিপ্ট পুনরায় ডাইরেক্ট করুন কলিং ক্লায়েন্টের কাছে, মূলত দ্বিতীয় বার জেনারেটর পৃষ্ঠাতে কল করুন। দ্রষ্টব্য: এটি অন্লোড ইভেন্টটিকে IE এ আগুন দেবে কারণ এটি একটি নিয়মিত পৃষ্ঠার মতো কাজ করে acting
  • ক্যাশে থেকে সামগ্রীটি সরিয়ে ক্লায়েন্টকে প্রেরণ করুন।

দাবি অস্বীকার, ব্যস্ত সাইটে এটি করবেন না, কারণ ক্যাশে যোগ হতে পারে। তবে সত্যই, যদি দীর্ঘস্থায়ী প্রক্রিয়াতে ব্যস্ত আপনার সাইটগুলি আপনাকে যাইহোক থ্রেডের অনাহারে ফেলে দেয়।

কোডবিহাইন্ডের মতো দেখতে এখানে যা আপনার সত্যই প্রয়োজন।

public partial class Download : System.Web.UI.Page
{
    protected System.Web.UI.HtmlControls.HtmlControl Body;

    protected void Page_Load( object sender, EventArgs e )
    {
        byte[ ] data;
        string reportKey = Session.SessionID + "_Report";

        // Check is this page request to generate the content
        //    or return the content (data query string defined)
        if ( Request.QueryString[ "data" ] != null )
        {
            // Get the data and remove the cache
            data = Cache[ reportKey ] as byte[ ];
            Cache.Remove( reportKey );

            if ( data == null )                    
                // send the user some information
                Response.Write( "Javascript to tell user there was a problem." );                    
            else
            {
                Response.CacheControl = "no-cache";
                Response.AppendHeader( "Pragma", "no-cache" );
                Response.Buffer = true;

                Response.AppendHeader( "content-disposition", "attachment; filename=Report.pdf" );
                Response.AppendHeader( "content-size", data.Length.ToString( ) );
                Response.BinaryWrite( data );
            }
            Response.End();                
        }
        else
        {
            // Generate the data here. I am loading a file just for an example
            using ( System.IO.FileStream stream = new System.IO.FileStream( @"C:\1.pdf", System.IO.FileMode.Open ) )
                using ( System.IO.BinaryReader reader = new System.IO.BinaryReader( stream ) )
                {
                    data = new byte[ reader.BaseStream.Length ];
                    reader.Read( data, 0, data.Length );
                }

            // Store the content for retrieval              
            Cache.Insert( reportKey, data, null, DateTime.Now.AddMinutes( 5 ), TimeSpan.Zero );

            // This is the key bit that tells the frame to reload this page 
            //   and start downloading the content. NOTE: Url has a query string 
            //   value, so that the content isn't generated again.
            Body.Attributes.Add("onload", "window.location = 'binary.aspx?data=t'");
        }
    }

0

ডাউনলোডের ডায়ালগ প্রদর্শিত না হওয়া অবধি যদি আপনি কেবল কোনও বার্তা বা লোডার জিআইফ প্রদর্শন করতে চান তবে একটি দ্রুত সমাধান হ'ল বার্তাটি কোনও লুকানো ধারকটিতে রেখে দেওয়া হয় এবং ডাউনলোড করার জন্য ফাইলটি উত্পন্ন করার জন্য যে বোতামটি ক্লিক করা হয় আপনি কনটেইনারটি দৃশ্যমান করে তোলেন। তারপরে বার্তাটি থাকা ধারকটি লুকিয়ে রাখতে বোতামটির ফোকাসআউট ইভেন্টটি ধরতে jquery বা জাভাস্ক্রিপ্ট ব্যবহার করুন


0

যদি ব্লিম সহ এক্সএমএলএইচটিএইচপিস্টেস্ট কোনও বিকল্প না হয় তবে আপনি নিজের ফাইলটি নতুন উইন্ডোতে খুলতে পারেন এবং উইন্ডো বডিটিতে অন্তর্নিহিত দ্বারা এনাই উপাদানগুলি পপুল করা হয়েছে কিনা তা পরীক্ষা করতে পারেন।

var form = document.getElementById("frmDownlaod");
 form.setAttribute("action","downoad/url");
 form.setAttribute("target","downlaod");
 var exportwindow = window.open("", "downlaod", "width=800,height=600,resizable=yes");
 form.submit();

var responseInterval = setInterval(function(){
	var winBody = exportwindow.document.body
	if(winBody.hasChildNodes()) // or 'downoad/url' === exportwindow.document.location.href
	{
		clearInterval(responseInterval);
		// do your work
		// if there is error page configured your application for failed requests, check for those dom elemets 
	}
}, 1000)
//Better if you specify maximun no of intervals


0

এই জাভা / স্প্রিং উদাহরণটি একটি ডাউনলোডের শেষে সনাক্ত করে, যে সময়ে এটি "লোডিং ..." সূচকটি গোপন করে।

পদ্ধতির: জেএসের দিকে, 2 মিনিটের সর্বোচ্চ মেয়াদোত্তীর্ণ বয়স সহ একটি কুকি সেট করুন এবং কুকির মেয়াদ শেষ হওয়ার জন্য প্রতি সেকেন্ডে পোল করুন । তারপরে সার্ভার-সাইড পূর্বের সাথে এই কুকিকে ওভাররাইড করে মেয়াদোত্তীর্ণ বয়সের - সার্ভার প্রক্রিয়াটির সমাপ্তি। জেএস পোলিংয়ে কুকির মেয়াদ শেষ হওয়ার সাথে সাথে "লোডিং ..." লুকানো আছে।

জেএস সাইড

function buttonClick() { // Suppose this is the handler for the button that starts
    $("#loadingProgressOverlay").show();  // show loading animation
    startDownloadChecker("loadingProgressOverlay", 120);
    // Here you launch the download URL...
    window.location.href = "myapp.com/myapp/download";
}

// This JS function detects the end of a download.
// It does timed polling for a non-expired Cookie, initially set on the 
// client-side with a default max age of 2 min., 
// but then overridden on the server-side with an *earlier* expiration age 
// (the completion of the server operation) and sent in the response. 
// Either the JS timer detects the expired cookie earlier than 2 min. 
// (coming from the server), or the initial JS-created cookie expires after 2 min. 
function startDownloadChecker(imageId, timeout) {

    var cookieName = "ServerProcessCompleteChecker";  // Name of the cookie which is set and later overridden on the server
    var downloadTimer = 0;  // reference to timer object    

    // The cookie is initially set on the client-side with a specified default timeout age (2 min. in our application)
    // It will be overridden on the server side with a new (earlier) expiration age (the completion of the server operation), 
    // or auto-expire after 2 min.
    setCookie(cookieName, 0, timeout);

    // set timer to check for cookie every second
    downloadTimer = window.setInterval(function () {

        var cookie = getCookie(cookieName);

        // If cookie expired (NOTE: this is equivalent to cookie "doesn't exist"), then clear "Loading..." and stop polling
        if ((typeof cookie === 'undefined')) {
            $("#" + imageId).hide();
            window.clearInterval(downloadTimer);
        }

    }, 1000); // Every second
}

// These are helper JS functions for setting and retrieving a Cookie
function setCookie(name, value, expiresInSeconds) {
    var exdate = new Date();
    exdate.setTime(exdate.getTime() + expiresInSeconds * 1000);
    var c_value = escape(value) + ((expiresInSeconds == null) ? "" : "; expires=" + exdate.toUTCString());
    document.cookie = name + "=" + c_value + '; path=/';
}

function getCookie(name) {
    var parts = document.cookie.split(name + "=");
    if (parts.length == 2 ) {
        return parts.pop().split(";").shift();
    }
}

জাভা / স্প্রিং সার্ভার সাইড

    @RequestMapping("/download")
    public String download(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //... Some logic for downloading, returning a result ...

        // Create a Cookie that will override the JS-created Max-Age-2min Cookie 
        // with an earlier expiration (same name)
        Cookie myCookie = new Cookie("ServerProcessCompleteChecker", "-1");
        myCookie.setMaxAge(0); // this is immediate expiration, 
                               // but can also add +3 sec. for any flushing concerns
        myCookie.setPath("/");
        response.addCookie(myCookie);
        //... -- presumably the download is writing to the Output Stream...
        return null;
}

কুকিটি জেএস স্ক্রিপ্ট দ্বারা তৈরি করা হয়েছে তবে এটি নিয়ামক দ্বারা আপডেট করা হয়নি, এটি মূল মান (0) বজায় রাখে, পৃষ্ঠাটি রিফ্রেশ না করে কীভাবে আমি কুকির মান আপডেট করতে পারি?
শেসুকি

এটি আশ্চর্যজনক - আপনি নামটি ঠিক সঠিকটি নিশ্চিত করতে পারবেন ? নাম মেলে এটি কুকিকে ওভাররাইট করবে। আমাকে
জানাবেন

আসল মান 0 হয় না। জেএসে আসল মান সেট 2 মিনিট। সার্ভারের সাথে যে নতুন মানটি সংশোধন করার কথা রয়েছে তা 0
জিন বি।

এছাড়াও, আপনি কি এটি করছেন: myCookie.setPath("/"); response.addCookie(myCookie);
জিন বি।

আমি খুঁজে পেয়েছি (কোনও কারণে), প্রতিক্রিয়া করার আগে আমার কুকি যুক্ত করা উচিত getgetOutputStream (); (ডাউনলোড ফাইলগুলিকে সংযুক্ত করার জন্য প্রতিক্রিয়া আউটপুট স্ট্রিম পাচ্ছে), আমি যখন এই পদক্ষেপের পরে এটি করেছি তখন তা বিবেচনায় নেওয়া হয়নি
শেসুকি

0

প্রাইমফেসগুলিও কুকি পোলিং ব্যবহার করে

https://github.com/primefaces/primefaces/blob/32bb00299d00e50b2cba430638468a4145f4edb0/src/main/resources/META-INF/resources/primefaces/core/core.js#L458

    monitorDownload: function(start, complete, monitorKey) {
        if(this.cookiesEnabled()) {
            if(start) {
                start();
            }

            var cookieName = monitorKey ? 'primefaces.download_' + monitorKey : 'primefaces.download';
            window.downloadMonitor = setInterval(function() {
                var downloadComplete = PrimeFaces.getCookie(cookieName);

                if(downloadComplete === 'true') {
                    if(complete) {
                        complete();
                    }
                    clearInterval(window.downloadMonitor);
                    PrimeFaces.setCookie(cookieName, null);
                }
            }, 1000);
        }
    },

-2

বোতাম / লিঙ্কটি ক্লিক করা হলে একটি আইফ্রেম তৈরি করুন এবং এটি শরীরের সাথে যুক্ত করুন।

                  $('<iframe />')
                 .attr('src', url)
                 .attr('id','iframe_download_report')
                 .hide()
                 .appendTo('body'); 

বিলম্বের সাথে একটি আইফ্রেম তৈরি করুন এবং ডাউনলোডের পরে মুছুন।

                            var triggerDelay =   100;
                            var cleaningDelay =  20000;
                            var that = this;
                            setTimeout(function() {
                                var frame = $('<iframe style="width:1px; height:1px;" class="multi-download-frame"></iframe>');
                                frame.attr('src', url+"?"+ "Content-Disposition: attachment ; filename="+that.model.get('fileName'));
                                $(ev.target).after(frame);
                                setTimeout(function() {
                                    frame.remove();
                                }, cleaningDelay);
                            }, triggerDelay);

এটিতে তথ্যের অভাব রয়েছে এবং এটি "কখন লোডিং লুকানো হবে" সমস্যাটি সমাধান করে না solve
টম রোগেরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.