Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]problem z downloadem
Forum PHP.pl > Forum > Przedszkole
shreker
Witam ! mam dość prosty skrypt downloadu. Teoretycznie działa (ale tylko jezeli pliki są uprzednio spakowane), natomiast przy zwykłych plikach (np. *.pdf) podczas próby otwarcia sciagnietego pliku wyskakuje błąd - cos w rodzaju że plik został zle przetworzony podczas downloadu i otwarcie jest niemozliwe, podobnie jest z plikami graficznymi. Co jest zle?
  1. $folder = 'download/';
  2. function sprawdzPlik($plik)
  3. {
  4. $wyr = "^[a-z0-9_-]+(\.[a-z0-9_-]+)*$";
  5. return eregi($wyr,$plik);
  6. }
  7. function downloader($plik,$folder)
  8. {
  9. if(!file_exists($folder.$plik))
  10. {
  11. echo 'nie ma takiego pliku na serverze !';
  12. return;
  13. }
  14. $file = @fopen($folder.$plik,"r");
  15. flock($file,2);
  16. $rozmiar = filesize($folder.$plik);
  17. $zawartosc = fread($file,filesize($folder.$plik));
  18. flock($file,3);
  19. fclose($file);
  20. header("Content-Type: application/octet-stream");
  21. header("Content-Lenght: $rozmiar;");
  22. header("Content-Disposition: attachment; filename=$plik");
  23. echo $zawartosc;
  24. }
  25.  
  26. if(isset($_GET['plik']))
  27. {
  28. if(!sprawdzPlik($_GET['plik']))
  29. {
  30. echo 'nie ma takiego pliku na serverze !';
  31. }
  32. else
  33. {
  34. downloader($_GET['plik'],$folder);
  35. }
  36. }
  37. else
  38. {
  39. echo 'nie ma takiego pliku na serverze !';
  40. }
  41. echo '<a href="index.php?pokaz=sites/testowa&plik=test.zip">plik</a>';
piotrooo89
wklej dokładny kod błędu! to jest dość ważne.
shreker
Cytat(piotrooo89 @ 7.12.2009, 13:11:37 ) *
wklej dokładny kod błędu! to jest dość ważne.

podczas proby otwarcia np pliku *.pdf (oczywiście po "downloadzie") wyswietla mi się coś takiego:
Acrobat nie mógł otworzyć pliku plik1.pdf ponieważ nie jest obługiwanym plikiem typu lub ponieważ plik został uszkodzony (np. został wysłany jako załącznik, i nie został poprawnie rozkodowany).
kosmowariat
zapisz sobie ten plik na dysku i otwórz w notatniku, zobacz czy w międzyczasie nie wyrzuca jakichś warnów/noticeów czy innych błędów


edit :
już widzę błąd, najpierw wysyłasz zawartośc pliku a potem masz jeszcze
echo '<a href="index.php?pokaz=sites/testowa&plik=test.zip">plik</a>';
darko
1. Mi to wygląda na jakiś mechanizm zabezpieczeń, ograniczający dostęp do pliku po określonej dacie wygaśnięcia.
2. Sprawdź jeszcze sumę kontrolną przed i po wysłaniu pliku na serwer, jeśli są identyczne, to przyczyną takiego stanu rzeczy będzie raczej w/w mechanizm (bo nie widzę, żebyś gdzieś modyfikował plik).
3. Możesz też spróbować wywalić flocki, poza tym, jeśli wysyłasz w headerze: header("Content-Type: application/octet-stream"); to nie wiem czy w miejscu application/octet-stream nie powinno być application/pdf, lepiej ustawiać właściwe mime-type dla odpowiedniego typu (rozszerzenia) pliku
4. Nie mam też pewności czy nie lepiej np. tak:

$handle = fopen($folder.$filename, "rb");
$contents = fread($handle, filesize($folder.$filename));
fclose($handle);
// headery i
echo $contents;

albo:

$data = file_get_contents($folder.$filename);
// tu wysyłasz headery i:
echo $data;


Próbuj


// edit
Racja! (post wyżej), nie zauważyłem, w ten sposób dopisujesz coś do zawartości pliku, który wysyłasz do przeglądarki, tu leży przyczyna
varez
przy wiekszych plikach zabijesz serwer takim skryptem tongue.gif a jak wieszasz to na shared hostingu to spodziewaj sie blokady
piotrooo89
poustawiaj odpowiednie mime.
shreker
Próbowałem jak doradzał darko, ale nadal ta sama sytuacja. Znacie moze gdzieś dobry skrypt downloadu, i działający?
darko
I tak, wychodzi na to, że źle radzę... a usunąłeś ostatnią linię kodu, jak radził kosmowariat ? To:

echo '<a href="index.php?pokaz=sites/testowa&plik=test.zip">plik</a>';

questionmark.gif

ps. w funkcji sprawdzPlik zastosowałbym raczej: return is_file($plik);
emp
Dodajesz jakieś krzaki przed samym plikiem i masz uszkodzone pliki. Wystarczy niepotrzebna spacja, biały znak, jedna kropka i już plik jest uszkodzony i nie do odczytania.
Otwórz plik najlepiej hexedytorem i zobacz co masz na jego początku - porównaj to z dobrym plikiem tego samego typu który się otwiera. Początek pliku to jego nagłówek określający jego typ i dla plików tego samego typu jak pdf, jpg musi być taki sam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.