Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Po downloadzie plików wyświetla się źródło strony
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Mam skrypt który po kliknięciu w link z plikiem przekierowuje do index.php?page=files gdzie za pomocą nagłówków plik jest wysyłany do downloadu. Pod IE wszystko działa jak należy ale pod Mozillą dzieją się dziwne rzeczy. Nie ważne czy kliknie się lewym w link czy prawym i 'Zapisz element docelowy jako..' to później po kliknięciu w jakikolwiek link wyświtla się strona ze źródłem + jakaś chińszczyzna.

Formularz do wysyłania plików (files.php):
  1. <form enctype="multipart/form-data" action="index.php?page=files" method="POST">
  2. Plik:<input name="userfile" type="file" /><br />
  3. Tytuł pliku:<input type="text" name="file_subject" /><br />
  4. Komentarz do pliku:<textarea name="file_comment" ></textarea><br />
  5. <input type="submit" name="file_send_button" value="Wyślij plik" />
  6. </form>
Zadaniem tego formularza jest wysłanie POSTów do pliku index.php który wysyła plik za pomocą nagłówków. Zmienna $_GET['page']; mówi żeby index.php w dalszej części strony includował plik files.php który dodaje plik na serwer + do bazy, wyświetla pliki, umożliwia upload oraz zarządza usuwaniem itp.

Teraz fragment files.php który 'obrabia' wysłane uprzednio informacje o uploadowanym pliku:
  1. if(isset($_POST['file_send_button'])){
  2. $file_subject=$_POST['file_subject'];
  3. $file_comment=$_POST['file_comment'];
  4. db_connect(); //funkcja zdefiniowana gdzie indziej - działa ok
  5.  
  6. //uaktualnienie bazy danych o upload'owany plik
  7. $query="INSERT INTO t_files VALUES ( NULL , '".$_FILES['userfile']['name']."' , '$file_subject', '$file_comment', '$added_by', NOW() , '$file_code', '0')"; //$added_by to id usera dodającego plik
  8.  
  9. if(!$result = mysql_query($query)){
  10. echo 'Błąd instrukcji INSERT!';
  11. }
  12.  
  13. $count = @mysql_affected_rows();
  14. if($count <> 1){
  15. echo 'Błąd serwera!';
  16. }
  17.  
  18. else{
  19. $file_message_return=0;
  20. }
  21.  
  22. //jesli dodanie pliku do bazy == ok
  23. if($file_message_return==0){
  24. mkdir("$path_to_file_folder/$new", 0777); //$new to id dodanego właśnie pliku
  25.  
  26. if( is_uploaded_file( $_FILES['userfile']['tmp_name'] ) )
  27. {
  28. $strUploadDir = $path_to_file_folder.'/'.$new.'/' . $_FILES['userfile']['name'];
  29.  
  30. if( move_uploaded_file( $_FILES['userfile']['tmp_name'], $strUploadDir ) )
  31. { echo 'Plik został pomyślnie uploadowany! }
  32. else{echo 'Upload pliku nie powiódł się!'; }
  33.  
  34. }
  35.  
  36. else{ echo 'Wystąpił błąd podczas wysyłania pliku na serwer!'; }
  37.  
  38. mysql_close();
  39. }
  40. }


Teraz fragment files.php który wyświetla pliki w dziale download:
  1. db_connect();
  2.  
  3. $query = "SELECT t_files.file_name , t_files.subject , t_files.comment , t_users.name , t_files.date_added , t_files.downloaded , t_files.id_file FROM t_files , t_users WHERE t_users.id_user=t_files.added_by ORDER BY t_files.id_file desc";
  4.  
  5. $result = @mysql_query ($query);
  6. $num = mysql_num_rows ($result);
  7.  
  8. if ($num > 0) {
  9.  
  10. while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
  11. //pomine zbedna reszte; wklejam tylko link do pliku
  12.  
  13. $file='xxxxx/'.$row[6].'/'.$row[0];
  14. if(file_exists($file)){
  15. echo '<a href="index.php?page=files&file_id='.$row[6].'&file_name='.$row[0].'">'.$row[0].'</a>';
  16. }
  17. }
  18. mysql_free_result ($result);
  19. } else {
  20. echo 'Aktualnie nie ma żadnych plików.';
  21. }


No i finalnie, najważniejszy kod: fragment index.php odpowiedzialny za obróbkę linku index.php?page=files&file_id=id&file_name=nazwa oraz za wysłanie nagłówków.
  1. if(isset($_GET['file_id']) && isset($_GET['file_name'])){
  2. $path = 'xxxx/'.$_GET['file_id'].'/'.$_GET['file_name'];
  3.  
  4. //sprawdzenie czy plik istnieje
  5. if(file_exists($path)){
  6.  
  7. header("Pragma: public");
  8. header("Expires: 0");
  9. header("Cache-Control: no-store, must-revalidate, post-check=0, pre-check=0");
  10. header("Content-Type: application/force-download");
  11. header("Content-Type: application/octet-stream");
  12. header("Content-Type: application/download");
  13. header("Content-Disposition: attachment; filename=\"".basename($path)."\";");
  14. header("Content-Transfer-Encoding: binary");
  15. header("Content-Length: ".filesize($path));
  16. //header('Location: index.php');
  17. @readfile($path);
  18. }
  19. else{$nofile=1;}
  20. }
  21.  
  22. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  23. <html xmlns="http://www.w3.org/1999/xhtml">
  24. <head>
  25. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  26. <title>';
  27. // itd htmla

Co tu jest nie tak, że Mozilla (i właściwie Opera też) nie może sobie z tym poradzić? Dodam, że plik da się zciągnąć w FF ale tylko przez klik prawym i 'Zapisz..' ale i tak przy nastepnym kliknięciu w jakikolwiek inny link na stronie wywala jej źródło z jakimiś krzaczkami. Dzieje się tak też po F5.
erix
  1. header("Content-Type: application/force-download");
  2. header("Content-Type: application/octet-stream");
  3. header("Content-Type: application/download");

Spróbuj wysyłać tylko z octet-stream.
sadistic_son
Niestety, to nie pomogło:(
Nawet po przejsciu gdzies dalej i kliknieciu wstecz nadal wywala zrodlo strony.
Nikt nie miał podobnego problemu?
vokiel
Proponuję inaczej. W pliku php, który wysyła wybrany plik do przeglądarki zrobić tylko wysyłanie. Nie mieszać nagłówków. Bo jak już raz wyślesz, że to będzie plik, to później trzeba by wysłać inne, że to już się plik skończył, a nie wiem czy tak się w ogóle da blinksmiley.gif
Czyli pobieranie pliku - getfile.php:
  1. <?php
  2. if(isset($_GET['file_id']) && isset($_GET['file_name'])){
  3. $path = '../test/'.$_GET['file_id'].'/'.$_GET['file_name'];
  4. //sprawdzenie czy plik istnieje
  5. if(file_exists($path)){
  6. header("Cache-Control: public");
  7. header("Content-Description: File Transfer");
  8. header('Content-disposition: attachment; filename='.$_GET['file_name']);
  9. header("Content-Type: application/force-download");
  10. header("Content-Type: application/octet-stream");
  11. header("Content-Type: application/download");
  12. header("Content-Transfer-Encoding: binary");
  13. header('Content-Length: '.filesize($path));
  14. @readfile($path);
  15. }
  16. }
  17. return false;
  18. ?>


A w tym files.php po prostu:
  1. <?php
  2. if(file_exists($file)){
  3. echo '<a href="getfile.php&amp;file_id='.$row[6].'&amp;file_name='.$row[0].'">'.$row[0].'</a>';
  4. }
  5. ?>
sadistic_son
pomysl wydaje sie byc dobry, ale jak sie kliknie w link i otworzy sie getfile.php to nic sie nie dzieje:/
vokiel
Jeśli zrobiłeś to dobrze, to się ta strona nie otwiera w ogóle, dalej pozostajesz na tej z której kliknąłeś w link. getfile.php przekazuje do przeglądarki, że nie jest stroną, tylko plikiem do pobrania. Tak jakbyś wskazał link do pliku fizycznie umieszczonego na serwerze.
sadistic_son
Rzeczywiście działa biggrin.gif Coś musiałem wcześniej pochrzanić! Dzięki wielkie snitch.gif "Pomógł" razy 2!! Pozdrawiam snitch.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.