Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skrypt downloadera - problem
Forum PHP.pl > Forum > PHP
boncio
Witam, jakiś czas temu postanowiłem zmodernizować jeden ze swoich serwisów, który umożliwia m.in. pobieranie plików ZIP (z różna zawartością - pliki html, obrazki itp). Wcześniej umieszczałem na stronie link z pełną ścieżką do pliku i problemu nie było. Teraz jednak ścieżka i nazwa pliku musi pozostać nieznana dla użytkownika. Dlatego zdecydowałem się na napisanie prostego downloadera. Mam jednak z nim pewne problemy. Poniżej zamieszczam kod 3 funkcji do pobierania pliku i właściwie żadna nie działa tak jak powinna. Jeżeli ktoś ma jakieś pomysły co jest z nimi nie tak lub ma własna funkcje która działa w 100% to prosze o pomoc.

Pierwsza funkcja i trzecia mają ten sam problem; zdarzają się sytuacje, że niektórzy użytkownicy nie mogą rozpakować żadnego z pobranych plików. Pojawia się informacja, że dane archiwum może być uszkodzone itp. Ponowne pobranie wtedy tez nie pomaga. Problem ten dotyczy niewielkiej cześci użytkowników no ale jednak. Z rozmów z tymi osobami wynika, że jest to niezależne od przeglądarki. Ja testowałem to u siebie na 3 komputerach i pod wszystkimi najpopularniejszymi przegladarkami w różnych wersjach i wszystko działa. Znajomym też. Tak jak napisałem dotyczy to tylko niewielkiej grupy osób, ale nie moge znaleźć jakiejś wspólnej cechy.

Druga funkcja działa najgorzej. Testy wykazały, że w Operze lub w IE (nie pamiętam już) po rozpakowaniu otrzymujemy tylko jeden plik bez rozszeżenia zamiast normalnych katalogów i plików. Z eksperymentów doszedłem do wniosku, że powodem jest linia określająca typ zawartości Content-Type: application/zip. Jeżeli we funkcji 1 i 3 zastąpie application/force-download application/zip to one też zaczną sprawiać ten sam problem. Dotyczy to też odwrotnej sytuacji, gdy w funkcji 2 zamienie application/zip na application/force-download to ona zacznie działać poprawnie (wystąpi wtedy najprawdopodobniej problem z poprzedniego akapitu dotyczący funkcji 1 i 3).


  1. <?php
  2. function getFile1($file, $filename)
  3.    {
  4.        if (file_exists($file))
  5.        {                        
  6.            header("Pragma: public");
  7.            header("Expires: 0");
  8.            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  9.            header("Cache-Control: private",false);
  10.            header("Content-Description: File Transfer");
  11.            header("Content-Type: application/force-download");
  12.            header("Content-Disposition: attachment; filename=\"".$filename."\";");
  13.            header("Content-Transfer-Encoding: binary");
  14.            header("Content-Length: ".filesize($file));
  15.            readfile($file);
  16.        }
  17.    }
  18.    
  19.    function getFile2($file, $filename)
  20.    {
  21.        if (file_exists($file))
  22.        {                        
  23.            header("Content-Type: application/zip");
  24.            header("Content-Length: ".filesize($file));
  25.            header("Content-disposition: inline; filename = " .$filename);
  26.            readfile($file);
  27.        }
  28.    }
  29.    
  30.    function getFile3($file, $filename)
  31.    {
  32.        if (file_exists($file))
  33.        {                        
  34.            header("Content-Type: application/force-download");
  35.            header("Content-Length: ".filesize($file));
  36.            header("Content-disposition: inline; filename = " .$filename);            
  37.            
  38.            $file2 = fopen($file, "r");
  39.            while (!feof($file2))
  40.            {
  41.                echo fread($file2, 128);
  42.            }
  43.            fclose($file2);
  44.        }
  45.    }
  46. ?>



Ma ktoś jakieś pomysły??
erix
Co do nazwy:
  1. <?php
  2. header("Content-disposition: inline; filename = " .$filename);
  3. ?>

Zobacz, co masz w dokumentacji dla header" title="Zobacz w manualu PHP" target="_manual.

A jeśli chodzi o uszkodzone ZIP-y, był już taki temat na forum.
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.