Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]pobieranie plików
Forum PHP.pl > Forum > Przedszkole
yaotzin
Witam mam skrypt napisany w PHP który zlicza pobranie plików, niestety zlicza nawet wówczas gdy ktoś kliknie w odnośnik do pliku i kliknie anuluj. Co mnie nie urządza za bardzo. Chciałbym zliczyć faktyczną ilość pobrań a nie kliknięć, ma ktoś jakiś pomysł, a może ktoś coś robił podobnego. Pozdrawiam.
ucho
Jeśli skrypt tylko robi redirect po zliczeniu to nic na to nie poradzisz. Jeśli skrypt samodzielnie wysyła plik po kawałku (mało prawdopodobne) to po prostu przenieś zliczanie na koniec skryptu. Pewnie można takie dane wyciągnąć także z access logów apacha ale nie będzie to raczej wygodne do zrobienia - w sumie nie jestem pewien czy jest tam zapisywana wielkość pliku/dokumentu czy ilość faktycznie przesłanych danych.
yaotzin
Cytat(ucho @ 1.09.2008, 17:49:16 ) *
Jeśli skrypt tylko robi redirect po zliczeniu to nic na to nie poradzisz. Jeśli skrypt samodzielnie wysyła plik po kawałku (mało prawdopodobne) to po prostu przenieś zliczanie na koniec skryptu. Pewnie można takie dane wyciągnąć także z access logów apacha ale nie będzie to raczej wygodne do zrobienia - w sumie nie jestem pewien czy jest tam zapisywana wielkość pliku/dokumentu czy ilość faktycznie przesłanych danych.


No wlasnie gość z serwisu algorytmy.pl stwierdził, że jest to możliwe, pytanie tylko czy przypadkiem nie ściemnia lub też może źle zrozumiał moje pytanie, a generalnie musiałbym wykupić abonament tylko po to, aby sprawdzić jego odpowiedź i choć to nieduże pieniądze to nie chce na razie płacić za wiedzę. I próbuję sam rozwiazać problem.
mrok
tu http://forum.php.pl/index.php?showtopic=93791&hl= masz kawałek kodu ktory wysyła plik do usera, wez dorzuc licznik i sprawdz co się dzieje jak klikniesz anuluj?

Przyznam ze zainteresowałeś mnie tematem winksmiley.jpg
yaotzin
No chyba nie tylko Ciebie to zainteresuje. Mi się wydaje że można to zrobić w sposób stuczny, tzn. z poziomu PHP zasymulować pobranie pliku, przeglądarka zgłasza pobranie i następnie po nacisnieciu ok wywoływany jest skrypt zliczający. Jest to minimalne zapewnienie że użytkownik pobrał plik. pytanko jak to zrobić, czy wystarczy ustawić jakis header czy też może stworzyć jakiś sztuczny plik. hmmmm....
Kicok
Nie da sie tak smile.gif

Niestety, ale po kliknięciu Zapisz w okienku które wyskoczy przeglądarka nie wysyła żadnych informacji do serwera. Tak na prawdę gdy widzimy to okienko, to plik jest już pobierany w tle.

Tricki typu:
  1. <?php
  2.  
  3. readfile( $filename );
  4. zwiekszLicznik();
  5.  
  6. // CZY:
  7.  
  8. echo file_get_contents( $filename );
  9. zwiekszLicznik();
  10.  
  11. ?>

też nie mają racji bytu. Skrypt PHP wyśle wszystkie dane do Apache'a (czy innego serwera http), zwiększy licznik i zakończy swoje działanie niezaleznie czy użytkownik zdecydował się pobrać plik, anulować pobieranie, czy czeka jeszcze na załadowanie strony.
yaotzin
Cytat(Kicok @ 2.09.2008, 10:36:41 ) *
Nie da sie tak smile.gif

Niestety, ale po kliknięciu Zapisz w okienku które wyskoczy przeglądarka nie wysyła żadnych informacji do serwera. Tak na prawdę gdy widzimy to okienko, to plik jest już pobierany w tle.

Tricki typu:
  1. <?php
  2.  
  3. readfile( $filename );
  4. zwiekszLicznik();
  5.  
  6. // CZY:
  7.  
  8. echo file_get_contents( $filename );
  9. zwiekszLicznik();
  10.  
  11. ?>

też nie mają racji bytu. Skrypt PHP wyśle wszystkie dane do Apache'a (czy innego serwera http), zwiększy licznik i zakończy swoje działanie niezaleznie czy użytkownik zdecydował się pobrać plik, anulować pobieranie, czy czeka jeszcze na załadowanie strony.



No dokładnie to wiem i z Tobą się zgadzam. Tylko problem jest tego typu że koleś z serwisu, którego kryptoreklamę już zrobiłem parę postów wyżej pisze że da się to zrobić... Nie chcę wykupywać abonamentu kwartalnego bo nie jest mi on aktualnie potrzebny, wolę sam dochodzić rozwiązań niż je kopiować, i pytanie tylko jak on to zrobił snitch.gif że niby mu to działa, bo taki licznik jest mi właśnie potrzebny.
Kicok
Zrobiłem kilka testów i zauważyłem, że jednak da się zrobić taki licznik:
  1. <?php
  2.  
  3. file_put_contents( 'pobrano_plik.txt', '0' );
  4.  
  5.  
  6. header( 'Content-Type: application/zip' );
  7. header( 'Content-Length: ' . filesize( 'test.zip' ) );
  8. header( 'Content-Disposition: attachment; filename=test2.zip' );
  9.  
  10. $fp = fopen( 'test.zip', 'rb' );
  11. while( !feof( $fp ) )
  12. {
  13. echo fread( $fp, 256 );
  14. usleep( 1 );
  15. }
  16. fclose( $fp );
  17.  
  18. file_put_contents( 'pobrano_plik.txt', '1' );
  19.  
  20. ?>


1. Trzeba użyć fopen" title="Zobacz w manualu PHP" target="_manual + fread" title="Zobacz w manualu PHP" target="_manual + fclose" title="Zobacz w manualu PHP" target="_manual. Funkcje readfile" title="Zobacz w manualu PHP" target="_manual, file_get_contents" title="Zobacz w manualu PHP" target="_manual czy fpassthru" title="Zobacz w manualu PHP" target="_manual nie zadziałają.
2. Trzbea plik przesłać przynajmnije w 2 częściach. Jeśli plik jest mały i prześlemy go w jednej części nie zadziała.
3. Trzeba użyć usleep" title="Zobacz w manualu PHP" target="_manual. Nie wiem dlaczego - może apache traktuje wtedy plik jako jedną całość (patrz puntk 1). Bez tej funkcji nie działa.
4. Podczas wysyłania pliku cały czas pracuje proces PHP. Jeśli na serwerze jest ustawiony limit wykonywania skryptu na 30 sekund, to użytkownik ma 30 sewkund na pobranie pliku. Nie zdąży - nie dostanie pliku w całości. ( set_time_limit" title="Zobacz w manualu PHP" target="_manual )

Jeśli komuś jest to potrzebne, to proszę bardzo. Osobiście traktuję to raczej jako ciekawostkę smile.gif


PS. Na początku chciałem nawet wykupić abonament na algorytmach, żeby sprawdzić jak oni to rozwiązali. Myślałem, że najtańszy to będzie SMS za dychę, czy coś w tym guście smile.gif
batman
Tutaj jest skrypt do pobierania pliku. Umożliwia on nawet wznawianie przerwanych ściągnięć i obsługę download managerów. Dodajesz do tego obsługę połączeń i wiesz kiedy użytkownik pobierze cały plik, a kiedy nie.
yaotzin
Cytat(Kicok @ 2.09.2008, 15:38:03 ) *
Zrobiłem kilka testów i zauważyłem, że jednak da się zrobić taki licznik:
[php]
PS. Na początku chciałem nawet wykupić abonament na algorytmach, żeby sprawdzić jak oni to rozwiązali. Myślałem, że najtańszy to będzie SMS za dychę, czy coś w tym guście smile.gif


No kiedyś tak mieli a teraz zrobili badziew na 3 miechy i generalnie nie chce mi się płacić za całośc wolałem wykupywać na miecha. Więc podziękowałem smile.gif dziękówa za okazaną pomoc. PZDR

A jak ktoś jeszcze chce się pobawić, to ciekawy drugi problem jak zliczyć ilość pobrań aktualizacji pluginu w ECLIPSE. Jak wiadomo jest tak że jak instalujemy sobie PDT w Eclipse to całość możemy zainstalować przez coś co nazywa się update-site i teraz muszę zliczać jeszcze ilość pobrań tych plików. I póki co działa mi licznik, ale jest za to inny problem. W katalogu znajduje się kilka wersji tego samego pluginu, ja muszę wiedzieć kiedy pobrano cały plugin a nie tylko część i rzecz druga którą wersję pobrano danego pluginu smile.gif podkreślam plugin nie jest rozdzielony na osobne katalogi biggrin.gif
batman
Tworzysz skrypt pośredniczący, który przekierowuje na odpowiedni plugin. W skrypcie wiesz jaki plugin będzie ściągany (np ze zmiennej $_GET), a ilość skończonych pobrań określisz dzięki funkcjom obsługi połączeń. Więcej informacji w moim poprzednim poście (a dokładniej w linkach, które podałem).
yaotzin
Żeby to było takie proste snitch.gif
batman
A co w tym trudnego?
yaotzin
Cytat(batman @ 3.09.2008, 10:44:35 ) *
A co w tym trudnego?


A wiesz może jak działa update site w Eclipse questionmark.gif Tam się nic przez przeglądarkę nie robi. Tylko z poziomu Eclipse, rzecz druga katalog nigdy nie jest wywoływany więc plik index.php nie zostanie wywołany, rzecz trzecia eclipse odwoluje sie zawsze do pliku site.xml, w ktorym sa podane pliki do pobrania, wiec nie jest to takie proste bo pliki nie moga nazywac sie inaczej... tudziez nie moze to byc url typu index.php?file=nazwa_pliku...
batman
To tworzysz osobne pliki php o takich samych nazwach jak pluginy, a w plikach tych wysyłasz plugin do ściągnięcia i zapisujesz statystyki. W pliki xml linkujesz do sktyptu, a nie bezpośrednio do pluginu.
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.