Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] download -- pobieram pusty plik...
Forum PHP.pl > Forum > Przedszkole
matis
Hej, mam problem ze ściąganiem plików zapisanych na serwerze. Pliki są zapisane poza DocumentRoot, więc nie ma do nich dostępu z przegladarki a jedynie z php-a. Informacje o plikach są przechowywane w bazie, w tym "nazwa_pliku" i "file_id". Linki do plików przekazują file_id przez URL, a następny plik pobiera to file_id, szuka w bazie pliku o takim id i dostaje pełną nazwę pliku.

W efekcie tego, po kliknięciu linku przez dość długi czas mam "Oczekiwanie...." po czym otwiera się okienko do ściągania. Nazwa i typ (ikonka) się zgadzają z oryginałem. Po kliknięciu OK plik natychmiast się sciąga, w ułamek sekundy --- bo jest pusty sad.gif Co robię źle? Proszę o pomoc. Oto kod:

I jeszcze jedno pytani ---- jak uniemożliwić pobranie pliku przez "Zapisz element docelowy jako...". Wydaje mi się, że gdy biorę "Zapisz element docelowy jako" i wpiszę nazwę taką pod jaką plik jest zapisany to i tak się sciągnie i będzie go można odczytać.
Zależy mi na tym ,żeby dostęp do plików był tylko i wyłączenie po zalogowaniu, żeby nie możnabyło sobie przekazywać linków i ściągać plików bez zalogowania.

  1. <?php
  2. $file_id = $_REQUEST['file_id'];
  3.  
  4. include("mysql_connection.php");
  5. $sql = "SELECT nazwa_pliku FROM g2_files WHERE file_id='" . $file_id . "'";
  6. $results = mysql_query($sql);
  7.  
  8. while($row = mysql_fetch_assoc($results))
  9. extract($row);
  10. // $nazwa_pliku jest tabelą w bazie, wiec moge ją dalej wykorzystywac
  11.  
  12. $plik = "/home/mateusz/files_G2/$filename";
  13.  
  14. //Gather relevent info about file
  15. $length = filesize($plik);
  16.  
  17.  $file_extension = substr($nazwa_pliku, strlen($nazwa_pliku)-3, 3);
  18.  
  19.  //This will set the Content-Type to the appropriate setting for the file
  20.  switch( $file_extension ) {
  21. case "pdf": 
  22. $ctype="application/pdf"; break;
  23.  case "exe":  
  24.  $ctype="application/octet-stream"; break;
  25.  case "zip": 
  26.  $ctype="application/zip"; break;
  27.  case "doc":
  28.  $ctype="application/msword"; break;
  29.  case "xls": 
  30.  $ctype="application/vnd.ms-excel"; break;
  31.  case "ppt": 
  32.  $ctype="application/vnd.ms-powerpoint"; break;
  33.  case "gif": 
  34.  $ctype="image/gif"; break;
  35.  case "png": 
  36.  $ctype="image/png"; break;
  37.  case "jpeg": case "jpg": 
  38.  $ctype="image/jpg"; break;
  39.  case "mp3": 
  40.  $ctype="audio/mpeg"; break;
  41.  case "wav": 
  42.  $ctype="audio/x-wav"; break;
  43.  case "mpeg": case "mpg": case "mpe": 
  44.  $ctype="video/mpeg"; break;
  45.  case "mov": 
  46.  $ctype="video/quicktime"; break;
  47.  case "avi": 
  48.  $ctype="video/x-msvideo"; break;
  49.  
  50.  
  51.  //forbidden
  52.  case "php": case "htm": case "html": case "txt": 
  53.  $_SESSION['error_msg'] = "Próbujesz ściągnąć niedozwolony
  54.  format pliku !!!";
  55.  header("Location: error.php");
  56.  break;
  57.  
  58.  
  59.  //jesli nie znany, ale nie zakazany (domyslny)
  60.  default: 
  61.  $ctype="application/force-download";
  62.  }
  63.  
  64. //Begin writing headers
  65. header("Pragma: public");
  66.  header("Expires: 0");
  67.  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  68.  header("Cache-Control: public");
  69.  header("Content-Description: File Transfer");
  70.  
  71.  //Use the switch-generated Content-Type
  72.  header("Content-Type: $ctype");
  73.  
  74.  //Force the download
  75.  $header="Content-Disposition: attachment; filename=".$nazwa_pliku.";";
  76.  header($header);
  77.  header("Content-Transfer-Encoding: binary");
  78.  header("Content-Length: ".$length);
  79.  
  80.  readfile($plik);
  81.  exit;
  82. ?>
nospor
1) SELECT nazwa_pliku FROM g2_files
pobierasz zapytaniem pole o nazwie "nazwa_pliku"

2)
  1. <?php
  2. while($row = mysql_fetch_assoc($results))
  3. extract($row);
  4. ?>

Wszystko co miales w tablicy zamieniasz na zmienne. czyli powstaje ci zmienna $nazwa_pliku

3)
$plik = "/home/mateusz/files_G2/$filename";
Do tworzenia pelnej sciezki uzywasz zmiennej $filename

Podsumowując:
Czy tak ciezko dac sobie w skrypcie:
  1. <?php
  2. echo $filename;
  3. ?>

By zobaczyc ze cos nie tak jest? Czy takie proste debugowanie naprawde jest az tak cięzkie?
matis
Witam,

oczywiście masz rację. Zagubiłem się już w zmiennych i zapomniałem zmienić nazwy tej jednej, przepraszam za zawracanie głowy - wszystko teraz działa w porządku, bardzo dziękuję.
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.