PHP bir dijital ürün indirmek sağlamak için en iyi yolu nedir?

3 Cevap php

Müşteriler indirme bağlantısı için ödeme Dijital ticari ürünler.

Ben web belge kök dışındaki tüm sıkıştırılmış dosyaları (ürün) koyduk ve alıcılar downloader ödeyen alıcı olduğundan emin olmak için paypal IPN ile entegre bir php komut dosyası aracılığıyla indirebilirsiniz.

Sıralama gibi: http://www.mysite.com/download.php?buyer_id=xxx

Şimdiye kadar hepsi sadece bir sorun ile çalışır. Ben yukarıdaki URL üzerinden indirmek zip dosyaları bozuk ve WinRAR ile düzgün açılamaz. Ancak, doğrudan indirilen zip gayet iyi.

Benim kod:

$path = WAREHOUSE_PATH.'/products/'.$identifier.'.zip';
$mm_type="application/octet-stream";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: " . $mm_type);
header("Content-Length: " .(string)(filesize($path)) );
header('Content-Disposition: attachment; filename="'.basename($path).'"');
header("Content-Transfer-Encoding: binary\n");

$fp = @fopen($path,"rb");
if ($fp) {
  while(!feof($fp)) {
    print(fread($fp, 1024*8));
    flush();
    if (connection_status()!=0) {
      @fclose($fp);
      die();
    }
  }
  @fclose($fp);
}

Ne yanlış olabilir? Teşekkürler!

Sorun çözüldü: ipuçları için teşekkür ederiz. Bu indirilen paketler olmamalıdır birkaç ekstra beyaz boşluk içerdiğini çıkıyor. Aptal.

3 Cevap

Ben bu değişen öneririm:

$fp = @fopen($path,"rb");
if ($fp) {
  while(!feof($fp)) {
    print(fread($fp, 1024*8));
    flush();
    if (connection_status()!=0) {
      @fclose($fp);
      die();
    }
  }
  @fclose($fp);
}

Buna

readfile($path);

Sen here readfile hakkında daha fazla bilgi bulabilirsiniz, ancak temelde bu döngü yaptığı her şeyi yapacağız.

Size Content-Transfer-Encoding başlık için ekstra bir satır karakteri var - belki de bu son başlık ve gövde arasında üç satır karakterleri sonuçta edilir?