Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] automatyczne rozpoczecie sciagania pliku
Forum PHP.pl > Forum > Przedszkole
suchar
Witam,
mam skrypt, ktory uploaduje plik na serwer, ladnie koduje url itd itd.
Teraz, jest drugi skrypt, ktory na podstawie zapisanego w mysql kodu pokazuje plik do sciagniecia pliku.
cos w stylu domena.pl/plik.php?kod=12345
szuka w bazie pliku o id 12345

I teraz mam problem - chce aby plik.php wyswietlil kilka danych o danym pliku (ktore sa juz zapisane w bazie)
na stronie, ale jednoczesnie rozpaczal sciaganie pliku dla uzytkownika - gdy dodam w pliku
Cytat
header("Location adrespliku");

skrypt od razu zaczyna sciagac plik, zamiast rownoczesnie wyswietlac stronę.
please help;) party.gif
mkdes
Oto jak można wymusić pobieranie pliku.
Stwórz plik np. download.php o poniższej treści i przekaż metodą GET do niego nazwę pliku i ścieżkę.

  1. <?php
  2. $plik=$_GET['plik'];
  3. $sciezka=$_GET['sciezka'];
  4. header("Content-type: application/txt");
  5. header("Content-Disposition: attachment; filename=$plik");
  6. readfile("$sciezka$plik");
  7. ?>

Linia ustawiająca typ MIME pliku.
  1. <?php
  2. header("Content-type: application/txt");
  3. ?>
suchar
Problem w tym, ze nie wiemy jakiego typu jest to plik, jakie ma rozszerzenie, tego skrypt "dowiaduje sie" dopiero podczas wywolywania.
a readfile zczytuje plik z dysku serwera i pieknie go wywala w przegladarce (krzaczki:) )

//edit: niby dziala, ale do tego doszedlem juz wczesniej - plik jest sciagany od razu, i tylko to, bez wyswietlenia zawartoci sckryptu (ktory robi jeszzce kilka rzeczy).
legorek
Manual: mime_content_type" title="Zobacz w manualu PHP" target="_manual

Dobrze jest też wysłać nagłówek z wielkością pliku:
  1. <?php
  2. header("Content-Length: ". filesize("jakisplik"));
  3. ?>


I najważniejsze na koniec:

ZAWSZE filtruj dane wejsciowe. Kod podany przez mkdes pozwala na sciagniecie dowolnego pliku Twojego serwisu.
suchar
no ok, powiedzmy ze doszedlem do tego ale nadal nie jest tak jak powinno:
Cytat

(chwilo wylaczylem force'owanie sciagania)

Przy wyslaniu prosby o plik ffcba3b5ebf3473f50b9cf4d20f26819/files24.png
(sciezka http://domena.pl/ffcba3b5ebf3473f50b9cf4d2...819/files24.png,
na dysku zapisany pod adresem /home/user/domena/ffcba3b5ebf3473f50b9cf4d20f26819/files24.png)


przegladarka zamiast sciagac plik files24.png sciaga plik o nazwie ffcba3b5ebf3473f50b9cf4d20f26819/files24.png

ktorego i tak nie mozna otworzyc w niczym.


//edit:
juz sciaga, ma poprawny rozmiar, ale przy otwieraniu (np. tego .png co podalem) ze nieznany format pliku.

moja koncowka pliku download.php:
Cytat
function mime_content_type ( $f )
{
return trim ( exec ('file -bi ' . escapeshellarg ( $f ) ) ) ;
}
$naglowek = mime_content_type($global_path);
$naglowek2 = $naglowek;
$plik = $name[0];
header("Content-Length: ". filesize($global_path));
header("Content-Disposition: attachment; filename=$plik");
header('Content-type: '.$naglowek2);
readfile($filespath . $get[0] . "/" . $plik);
ob_end_flush();
suchar
OK, to jak teraz zmucis przeg;adarke aby sciagala pliki graficzne i tekstowe?

mam taka strukturę katalogow:

katalog_glowny (tu dalem .htaccess)
|
|-subfolder1/plik.png
|-subfolder2/plik.txt
|-subfolder3/jakisplik

Zawartosc pliku .htaccess:
Cytat
AddType application/octet-stream image/png
AddType application/octet-stream txt
AddType application/octet-stream image/jpg
AddType application/octet-stream image/gif
AddType application/octet-stream html
AddType application/octet-stream png
AddType application/octet-stream jpg
AddType application/octet-stream gif

Niestety, wtedy server albo wywala internal server error, lub po prostu htacces nie dziala i plik sie wyswietla zamiast sciagac.
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.