Kullanıcı sonra bir dosyayı silme bunu indir

5 Cevap

i kullanıcıya dosya göndermek için kullanıyorum

header('Content-type:  application/zip');
header('Content-Length: ' . filesize($file));
header("Content-Disposition: attachment; filename="file.zip");
readfile($file);

kullanım indirdikten sonra ben bunu nasıl yapabilirim, bu dosyayı silmek istiyor?

thx

EDIT: Benim senaryo, böyle bir kullanıcı hits düğmesini indirmek zaman, benim komut dosyası bir sıcaklık yaratacaktır. zip dosyası ve kullanıcı bu geçici zip dosyasını silin edilecek daha sonra download

EDIT2: Tamam iyi yolu bir saat sonra geçici dosyaları temizleme edilecek bir cron işi çalışıyor görünüyor.

EDIT3: Kullanıcı yüklemeyi iptal sürece ben unlink, çalışır benim komut test. kullanıcı indirme iptal ederseniz, zip dosyası sunucu üzerinde kalır. böylece artık yeter :)

Edit4: WOW! connection_aborted() hile yaptı!

ignore_user_abort(true);
if (connection_aborted()) {
unlink($f);
}

kullanıcı indirme işlemini iptal olsa bile bu bir dosyayı silecektir.

5 Cevap

unlink($filename);

Bu dosyayı silecektir.

Bu kombine gerekiyor ignore_user_abort() Docs böylece unlink hala kullanıcı yüklemeyi iptal bile yürütülür.

ignore_user_abort(true);

...

unlink($f);

Benim de web sitesinin birinde çok benzer özelliğe sahip. Bu rastgele oluşturulan klasörü silme & gibi olacak zip dosyası sonra / download iptal. Ben burada anlatmaya çalışacağım, birisi yararlı olabilir.

skin.php:
This page contains download link such as "http://mysite.com/downoload/bluetheme"

.htaccess:
I have following rule in htaccess file to redirect the download request to a php file. [download.php].

RewriteRule ^download/([A-Za-z0-9]+)$ download.php?file=$1 [L]

download.php:

include "class.snippets.php";
$sn=new snippets();
$theme=$_GET['file'];
$file=$sn->create_zip($theme);
$path="skins/tmp/$file/$file.zip";
$config_file="skins/tmp/$file/xconfig.php";
$dir="skins/tmp/$file";

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

//remove file after download  
unlink($path);
unlink($config_file);
rmdir($dir);

böylece istek download.php üzerine parçacıkları sınıfını kullanarak rastgele bir adla bir dizin oluşturacaktır. Dizin içinde bir zip dosyası oluşturur. download / isteğini iptal tüm dosya ve dizin silinecektir sonra.

Aklıma en güvenli yolu, istemci tarafında transferini gözlemlemek ve ardından yükleme işlemini tamamladıktan sonra sunucuya bir XmlHttpRequest arama yapabilirsiniz bazı istemci tarafı flash film kullanmak olacaktır.

AFAIK, Flash (veya benzer bir tarayıcı eklentisi) kullanmadan güvenilir bir şekilde yapmak için hiçbir yolu yoktur

Dosyasından transfer ediliyor içeriği belleğe okumak ve bunu okuduktan sonra web sunucusu tarafından müşteriye gönderilecek çünkü sadece readfile sonra silmek için iyi çalışması gerekir. Bu noktadan itibaren, (readfile çağrısından sonra) silebilirsiniz.

Edit: ikinci düşünce, bazı istemciler birden isteklerini yapacak hızlandırıcıları kullanarak olacaktır. Bu nedenle, ben yazdım ne görmezden.

Benim için çalışmış bir şey bulamadı, bu yüzden benim için iyi iş gibi görünüyor, bu geldi:

header('Content-type: application/zip'); //this could be a different header 
header('Content-Disposition: attachment; filename="'.$zipName.'"');

ignore_user_abort(true);

$context = stream_context_create();
$file = fopen($zipName, 'rb', FALSE, $context);
while(!feof($file))
{
    echo stream_get_contents($file, 2014);
}
fclose($file);
flush();
if (file_exists($zipName)) {
    unlink( $zipName );
}

O birisi yardımcı olur umarım