PHP) büyük hatalar (benim sunucu feof dosyası oluşturmak fread ()

4 Cevap php

Kullanıcıların bir pdf 'olarak kaydetmek' sağlayan bir komut dosyası var, bu script -

<?php
header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);
?>

Bir hata günlüğü oluşturuldu ve bir kaç gün içinde bir konser daha fazla olması alır ediliyor aldığım hataları-

[10-May-2010 12:38:50] PHP Warning:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for BYJ-Timetable.pdf in /home/byj/public_html/pdf_server.php on line 10
[10-May-2010 12:38:50] PHP Warning:  Cannot modify header information - headers already sent by (output started at /home/byj/public_html/pdf_server.php:10) in /home/byj/public_html/pdf_server.php on line 10
[10-May-2010 12:38:50] PHP Warning:  fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12
[10-May-2010 12:38:50] PHP Warning:  feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13
[10-May-2010 12:38:50] PHP Warning:  fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15
[10-May-2010 12:38:50] PHP Warning:  feof(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 13
[10-May-2010 12:38:50] PHP Warning:  fread(): supplied argument is not a valid stream resource in /home/byj/public_html/pdf_server.php on line 15

The line 13 and 15 just continue on and on... I'm a bit of a newbie with php so any help is great. Thanks guys Nik

4 Cevap

Ne oluyor olduğunu:

  • Dosya bulunamadı, bu yüzden filesize function üzerinden errorred
  • Dışarı beklemedeki faturalar, hatalı, çünkü çıktı üretti.
  • Eğer çıkışı var bir kere, artık başlıkları göndermek OLAMAZ
  • Daha başlıkları gönderiyor, çünkü daha fazla hata alıyorsanız

Dosya bulunamadı Çünkü var olmayan bir dosyadan okumak için çalışıyoruz, çünkü senin süre döngü, sonsuza kadar hata olur.

ALSO: Bir dosya ONE içerik türü değil 4 vardır. Siz içerik türlerinden birini seçmek ve o birini kullanmak gerekir, hepsini geçemez.

Ve son olarak: Sizin komut korkunç olduğunu insecure. Birisi Geçerse ?file=/home/apache/secret_db_passwords.txt sonra hemen şeyler erişimi olurdu.

Düzenleme: PHP yapmak çalıştığınız tam olarak ne işlemek için tasarlanmıştır readfile adında bir işlevi vardır. Sen parça parça gönderme dosyası aracılığıyla bir süre döngü çalıştırmak gerekmez. Sadece readfile($file); yapmak ve web sunucusu sizin için tüm bu saçmalıkları idare edecek

Birkaç şey:

  1. Bu sayede sadece Content-Type dört kez anlamsız ayarı, bildiğim kadarıyla, bir zamanlar bir başlık ayarlayabilirsiniz.

  2. Eğer bir pdf mim türü içerik türünü ayarlamak eğer bu durumda ben application/pdf ile gitmek istiyorum, yardımcı olabilir.

  3. Force Download bildiğim kadarıyla, bir içerik türü değildir. Eğer Content-Disposition ayarlarsanız tarayıcı zaten, hangi attachment indirmek olacaktır.

  4. Son olarak, neden ondan akışı için çalışıyoruz (yok gibi görünüyor) dosyasının hiçbir PDF sürümü varsa? Muhtemelen gerçek dosya için $file değişkeni ayarlamak ve kullanıcı için çıkış PDF dosya adını ayarlamak için $filename gibi bir değişken yapmak istiyorum.

[10-May-2010 12:38:50] PHP Warning:  fopen(BYJ-Timetable.pdf) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/byj/public_html/pdf_server.php on line 12

Bu bilmeniz gereken ne söylemek gerekir: fopen ve filesize hem dosya açılacak, adını ve yolunu geçirilen gerekir. Bu durumda, sadece, hiçbir yolu dosya geçiyoruz, bu yüzden komut Bu durumda içeri çalıştıran geçerli dizinde bulmak için çalışıyor, /home.byj/public_html/

Bunu düzeltmek için, bu işlevleri değil, PDF dosyasının kendisini sadece isim açmak için PDF dosyasına bir akraba veya mutlak yolunu uygulamak gerekir.

Bunun yerine dosya parçalarını döngü ve okuma kullanabilirsiniz: http://php.net/manual/en/function.readfile.php?