İndirme tamamlandığında olmadığını kontrol

5 Cevap php

My question is - What is the best possible way to detect if a download is completed, because after that I want to update the database.

Ben php manuel bu kod bazı try'd, ama bu benim için çok fazla bir şey yok.

Header ( "Content-Type: application/octet-stream"); 
Header ( "Content-Length: ".filesize($file)); 
Header( "Content-Disposition: attachment; filename=$filename");

// buffered read not using readfile($file);

if ($fp = fopen($bestand, 'rb')) {
    while (!feof($fp)) {
        $buf = fread($fp, 4096);
        echo $buf;
        $bytesSent += strlen($buf);    /* We know how many bytes were sent to the user */
    }     
 }

if ($bytesSent == filesize($fp)) {
    //do something with db
}

teşekkürler zarf içinde, Richard

5 Cevap

Bu gerçekten indirme kullanıcı için tamamlanmış olup olmadığını söylemek için gitmiyor. you kullanıcıya bayt göndererek bitmiş, ancak kullanıcı aslında aldı kaç tanesi hakkında bir şey söylüyor olduğunda bunu size söyleyecektir.

Gerçekte, bir dosya indirme tamamlandığında gerçekten algılamak için PHP ile hiçbir şekilde (bir sunucu tarafı değil, bir istemci tarafı, dili olan) yoktur. Yapabileceğiniz en iyi o başladığında sizin veritabanı indir log. Kesinlikle, tamamen ve tamamen yükleme tamamlandığında bilmeniz gerekiyorsa, embed bir Java uygulaması gibi bir şey yapmak ya da Flash kullanmak zorunda olacak. Ancak, genellikle bu sizin kullanıcı için kullanılabilirlik açısından doğru cevap (neden Java veya Flash sadece sizden bir şey indirmek için? Yüklü olmasını gerektiren) değil.

Marc W'nin zaten işaret php gibi sadece sunucudan gönderilen oldum ne söyleyebilirim değil ne müşterinin yani olmayan bir marş kesinlikle php kullanılarak aldı.

Ama bir MD5 hash üreten ve sunucudaki dosyanın MD5 hash (on-sunucu MD5 tarafından üretilen bu karşılaştırarak bir JS kontrol çağıran bir düğmeye basarak yüklemeyi onaylamak için kullanıcı soran olasılığı her zaman vardır siz) ve JS komut dosyası db güncellemek veya aynı yapmak için bir php-script aramak için kullanmak başarılı bir karşılaştırma kullanımı.

You could always just ask them to check the download is what they expected and, if they hit "yes, it's fine" then update the database.


Edited: in response to OP's comment.

Thanks, but you can't depend on the users cooperativeness. Because they also have to pay for the download, it is better that I have all the controll.I think I will then update the database when the script is accessed. That seems to be the most reliable then.

Nasıl başlatmak ve sürdürmek-indir, ve, tamamlama bütünlüğünü doğrulayan ve db için bir güncelleştirme çalıştıran bir Ajax denetimi kullanma konusunda?

Ben otomatik olarak müşterilerinizin size seçim sonunda ne olursa olsun, yine de, seni rip olacak varsayarak değil öneririm. 'Sizin için işe yaramadı?' Güzel onları sorma değil ve eğer bir hata-rapora lider sizin ve onlar için yararlı olabilir.

Bazı kullanıcıların diyebilirsiniz iken Ama, ne olursa olsun, 'hayır', sadece ekstra kopya için onun durumu önlemek için artan iş yükü maliyetine karşı bunun maliyeti dengelemek zorunda. 'Dürüstlük' sürdürmenin maliyeti onların fazladan bir kopyasını alarak muhtemel / potansiyel maliyetini aşarsa, o zaman küçük bir nokta var.

Kullanıcı yüklemeyi iptal veya dosyanın tamamını aldı olmadığını bilmek için hiçbir yolu yoktur çünkü ben, kaç sokması dışarı gönderdi (ve aslında istemci üzerinden indirilen) olmuştur bilmek php ile mümkün olduğunu sanmıyorum.

Eğer (istemci tam çağrısı için) bir javascript (sunucu tarafı çağrısı için) php karıştırma eğer bir çözüm var.

Nasıl Detect when browser receives file download bu cevabı bak

I'm pretty sure you can have a good result like this. I hope this help others, Mike

Aşağıdaki kod çalışır. Indir müşteri tarafından durdurulursa, güncellenen veritabanı değil ve bağlantı tekrar ateş edebilirsiniz.

  $file='pathto.zip';

  header("Content-type: application/zip");
  header("Content-Disposition: attachment; filename=$file");
  header("Pragma: no-cache");
  header("Expires: 0");
  readfile("$file");

  $sql = "UPDATE YOUR TABLE"; 

  exit;