shreker
7.12.2009, 13:03:26
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?
$folder = 'download/';
function sprawdzPlik($plik)
{
$wyr = "^[a-z0-9_-]+(\.[a-z0-9_-]+)*$";
return eregi($wyr,$plik); }
function downloader($plik,$folder)
{
{
echo 'nie ma takiego pliku na serverze !'; return;
}
$file = @fopen($folder.$plik,"r"); header("Content-Type: application/octet-stream"); header("Content-Lenght: $rozmiar;"); header("Content-Disposition: attachment; filename=$plik"); }
{
if(!sprawdzPlik($_GET['plik']))
{
echo 'nie ma takiego pliku na serverze !'; }
else
{
downloader($_GET['plik'],$folder);
}
}
else
{
echo 'nie ma takiego pliku na serverze !'; }
echo '<a href="index.php?pokaz=sites/testowa&plik=test.zip">plik</a>';
piotrooo89
7.12.2009, 13:11:37
wklej dokładny kod błędu! to jest dość ważne.
shreker
7.12.2009, 13:23:20
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
7.12.2009, 13:40:21
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
7.12.2009, 13:44:53
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
7.12.2009, 13:45:42
przy wiekszych plikach zabijesz serwer takim skryptem

a jak wieszasz to na shared hostingu to spodziewaj sie blokady
piotrooo89
7.12.2009, 13:45:58
poustawiaj odpowiednie mime.
shreker
7.12.2009, 14:44:40
Próbowałem jak doradzał darko, ale nadal ta sama sytuacja. Znacie moze gdzieś dobry skrypt downloadu, i działający?
darko
7.12.2009, 14:46:15
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>';

ps. w funkcji sprawdzPlik zastosowałbym raczej: return is_file($plik);
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.