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
possible solution kullanan istemci üzerinde JavaScript.
İstemci algoritması:
- Bir rasgele benzersiz bir belirteç oluşturmak.
- İndirme isteği göndermek ve ALMAK/POST bir alanda belirteç vardır.
- Show "bekleme" göstergesi.
- Bir zamanlayıcı, ve her saniye ya da öylesine, bir kurabiye "fileDownloadToken" (veya ne olursa olsun karar). adlı Aramaya Başla
- Bilgisi var, ve onun değer token eşleşirse, "" göstergesi. bekleyen gizle
Sunucu algoritması:
- İstek GET/POST alanı için bak.
- 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
);
}
Nasıl dosya tarayıcı yerine indirme (p...
İframe içerik yüklü (Çapraz tarayıcı)v...
Tarayıcı fare olduğunu tespit ve dokun...
Android ile dosya indirme ve bir Progr...
Nasıl bir tarayıcı sürümünü tespit EDE...