Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pobieranie plików przez PLIK PHP
Forum PHP.pl > Forum > Przedszkole
Weles
Witam!

Od dawna miałem problem z pobieraniem plików z serwera i myślałem dotąd że to zła konfiguracja PHP czy serwera, ale dzisiaj dowiedziałem się że to wina czegoś innego - wina mojego skryptu PHP.

Zauważyłem to bardzo prostu - pliki pobieranie bezpośrednio pobierają się całe, a z pliki php przerywa pobieranie po około 10 sekundach.

Czytałem w internecie itd. ale mało wyszperałem, dowiedziałem się tylko że jeśli strona nie skończy się ładować w określonym czasie to przerywa się jej dalsze wczytywanie, nie wiem czy to przyczyna mojego problemu, a jeśli tak to jak w moim skrypcie to zmienić?

Mój skrypt wygląda tak:

  1. <?php
  2. include("include/ustawienia.php");
  3. if(isset($_GET['down'])) {
  4. $dane = mysql_fetch_array(mysql_query("SELECT * FROM c1uploader.pliki WHERE nazwa_linku='$_GET[down]' AND deleted='0000-00-00 00:00:00'"));
  5. if($dane == 0) {
  6. header("Location: index.php");
  7. } else {
  8. header('Content-type: text/application');
  9. header('Content-Disposition: attachment; filename="'.$dane[nazwa_pliku].'"');
  10. header("Content-Length: ".filesize("files/$_GET[down]"));
  11. readfile('files/'.$_GET['down']);
  12. mysql_query("UPDATE c1uploader.pliki SET pobrano=pobrano+1 WHERE id='$dane[id]'");
  13. }
  14. }
  15. ?>


Próbowałem nawet zmieniać miejsce ostatniego mysql_query a nawet je wywalać bo myślałem że przez to że wczytuje się ono dopiero po pobraniu pliku to powoduje, ale to także nie przyczyna..

Proszę o pomoc!
Pozdrawiam.
maxil
spróbuj tak:

  1. <?php
  2. include("include/ustawienia.php");
  3. if(isset($_GET['down'])) {
  4. $dane = mysql_fetch_array(mysql_query("SELECT * FROM c1uploader.pliki WHERE nazwa_linku='$_GET[down]' AND deleted='0000-00-00 00:00:00'"));
  5. if($dane == 0) {
  6. header("Location: index.php");
  7. } else {
  8. mysql_query("UPDATE c1uploader.pliki SET pobrano=pobrano+1 WHERE id='$dane[id]'");
  9. header('Content-type: application/force-download');
  10. header('Content-Disposition: attachment; filename="'.$dane[nazwa_pliku].'"');
  11. header('Content-Transfer-Encoding: binary');
  12. header("Content-Length: ".filesize("files/$_GET[down]"));
  13. readfile('files/'.$_GET['down']);
  14. }
  15. }
  16. ?>
Weles
Cytat(maxil @ 1.06.2012, 00:09:20 ) *
spróbuj tak:

  1. <?php
  2. include("include/ustawienia.php");
  3. if(isset($_GET['down'])) {
  4. $dane = mysql_fetch_array(mysql_query("SELECT * FROM c1uploader.pliki WHERE nazwa_linku='$_GET[down]' AND deleted='0000-00-00 00:00:00'"));
  5. if($dane == 0) {
  6. header("Location: index.php");
  7. } else {
  8. mysql_query("UPDATE c1uploader.pliki SET pobrano=pobrano+1 WHERE id='$dane[id]'");
  9. header('Content-type: application/force-download');
  10. header('Content-Disposition: attachment; filename="'.$dane[nazwa_pliku].'"');
  11. header('Content-Transfer-Encoding: binary');
  12. header("Content-Length: ".filesize("files/$_GET[down]"));
  13. readfile('files/'.$_GET['down']);
  14. }
  15. }
  16. ?>


gdy jest ob_flush(); to plik otwiera się w przeglądarce, a bez flusha tak czy owak i tak się przerywa pobieranie ;/
maxil
zwróć uwagę na:

header('Content-Disposition: attachment; filename="'.$dane[nazwa_pliku].'"');

oraz

header("Content-Length: ".filesize("files/$_GET[down]"));

tam mi się wydaje że czegoś brakuje ale może się mylę smile.gif
Weles
Gdy przerwie mi pobieranie pliku, w /var/log/error.log wyskakuje mi:
[Fri Jun 01 00:30:18 2012] [error] mod_qos(034): access denied, QS_SrvMinDataRate rule (out): min=154, this connection=0, c=MOJE IP

Co to może być?
maxil
a chmody na katalog i plik są odpowiednie?

@edit
ten błąd mówi że niema dostępu do wybranego pliku/katalogu

tak wygląda mój kod który działa w środowisku linuxowym wyśmienicie

  1. <?php
  2. include '../lib/common.php';
  3. include '../lib/config.php';
  4.  
  5. $dir = '../pliki_downloadu';
  6. $target = realpath($dir . '/' . $_GET['file']);
  7. if (strpos($target, $dir !==0)
  8. {
  9. die();
  10. }
  11.  
  12. if (file_exists($target) && is_file($target))
  13. {
  14. header('Content-Type: application/force-download');
  15. header('Content-Disposition: attachment; filename="' . $_GET['file'] . '";');
  16. header('Content-Transfer-Encoding: binary');
  17. header('Content-Length: ' . filesize($target));
  18. readfile($target);
  19. }
  20. ?>


przerób go sobie dla własnych potrzeb
i oczywiście katalog i pliki mają chmody 0777
Weles
Cytat(maxil @ 1.06.2012, 00:49:10 ) *
a chmody na katalog i plik są odpowiednie?

@edit
ten błąd mówi że niema dostępu do wybranego pliku/katalogu

tak wygląda mój kod który działa w środowisku linuxowym wyśmienicie

  1. <?php
  2. include '../lib/common.php';
  3. include '../lib/config.php';
  4.  
  5. $dir = '../pliki_downloadu';
  6. $target = realpath($dir . '/' . $_GET['file']);
  7. if (strpos($target, $dir !==0)
  8. {
  9. die();
  10. }
  11.  
  12. if (file_exists($target) && is_file($target))
  13. {
  14. header('Content-Type: application/force-download');
  15. header('Content-Disposition: attachment; filename="' . $_GET['file'] . '";');
  16. header('Content-Transfer-Encoding: binary');
  17. header('Content-Length: ' . filesize($target));
  18. readfile($target);
  19. }
  20. ?>


przerób go sobie dla własnych potrzeb
i oczywiście katalog i pliki mają chmody 0777


Nie pomogło, ale wpadłem na pomysł, żeby wejść do: "/etc/apache2/mods-available", i edytować dwa pliczki: "qos.conf" oraz "qos.load", wszystkie linijki zakomentowałem, patrze, uploader działa aż miło!

w każdym razie, dzięki za pomoc wink.gif
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.