SORU
9 Temmuz 2009, PERŞEMBE


Tarayıcı dosya indirme aldığında tespit

Kullanıcı dinamik olarak oluşturulan bir dosya indirmek için izin veren bir sayfa var. Bir "" göstergesi. bekleme göstermek istediğim çok uzun bir zaman oluşturmak için gereken, Sorun, tarayıcı dosyayı aldı, gösterge saklayabilirim ne zaman algılamak için nasıl çözemiyorum.

Gizli bir biçimde istek, sunucuya hangi Mesajlar yapıyorum, ve sonuçları için gizli bir iframe hedefler. Bu sonuç ile tüm tarayıcı penceresinin yerini bilmiyorum. Bir "indirme tamamlandığında ateş edileceğini umut iframe. olay yüklemek için dinliyorum

Ben bir "İçerik-Disposition: Eki" tarayıcı "" iletişim. Kaydet Haritayı neden olan dosya, üstbilgi dönüş Ama tarayıcı bir "iframe. olay yük ateş etmiyor

Denedim bir yaklaşım çok parçalı bir yanıt kullanıyor. Boş bir HTML olarak bağlı indirilebilir dosya göndermek istiyorsunuz. Örneğin:

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

Bu boş bir HTML dosyası alır, "yük" olay, sonra "Kaydet" indirilebilir dosya için iletişim. gösterir yangınlar Firefox çalışır; Ama başarısız IE ve Safari; YANİ yangınlar "yük" olay ama yok yükleme dosyasını ve Safari indirme dosyası (yanlış isim ve içerik-tipi) ve yok yangın "yük" olayı.

Farklı bir yaklaşım dosya oluşturma işlemine başla, hazır olana kadar server anket, önceden oluşturulmuş indirin sonra bir ara dosyası oluşturmak için olabilir. Ama bunun yerine, geçici dosya oluşturmadan sunucuda uzak dururdum.

Daha iyi bir fikri olan var mı?

CEVAP
12 Kasım 2010, Cuma


possible solution kullanan istemci üzerinde JavaScript.

İstemci algoritması:

  1. Bir rasgele benzersiz bir belirteç oluşturmak.
  2. İndirme isteği göndermek ve ALMAK/POST bir alanda belirteç vardır.
  3. Show "bekleme" göstergesi.
  4. Bir zamanlayıcı, ve her saniye ya da öylesine, bir kurabiye "fileDownloadToken" (veya ne olursa olsun karar). adlı Aramaya Başla
  5. Bilgisi var, ve onun değer token eşleşirse, "" göstergesi. bekleyen gizle

Sunucu algoritması:

  1. İstek GET/POST alanı için bak.
  2. Eğer boş olmayan bir değer varsa, bir çerez bırak ("") fileDownloadToken ve token değerini değerini ayarlayın. örneğin

(JavaScript) istemci kaynak kodu:

  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" );
  }

Örnek sunucu kodu (PHP):

    $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();

Nereye:

  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
    );
  }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Santozz Yazz

    Santozz Yazz

    23 Mart 2014
  • sghaff1

    sghaff1

    23 Mart 2009
  • thewinekone

    thewinekone

    17 Aralık 2005