Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie tymczasowego pliku i jego pobranie
Forum PHP.pl > Forum > PHP
zaajcu
Cześć.

Nie mogę sobie poradzić z stworzeniem pliku tymczasowego a potem umożliwić użytkownikowi jego pobranie.
Chodzi mi o coś takiego ,że gdy user kliknie w link to mu się dynamicznie utworzony pliki pobierze.

Dodam jeszcze bo pewnie ma to znaczenie że wszystko na stronie leci ajax'em, więc po kliknięciu w link leci post coś zwróci a użytkownikowi pojawi się okienko do pobrania pliku (takie jak przy normalnym pobieraniu)
Sephirus
Temat jest ciekawy. Jeżeli wysyłasz ajax request, który tworzy plik po czym zwraca do niego link - wyświetlając go gdzieś na stronie to pojawi się też kwestia "kiedy usunąc ten plik".

Moja propozycja:

Zmień rozumowanie - twoja koncepcja zawiera dwa punkty:
1. ajax - generacja pliku i utworzenie do niego linku
2. link - pobranie pliku

Co z kasowaniem?

Moja koncepcja 2 kroki:
1. ajax - sprawdzanie wszystkiego dotyczącego tego czy user może pobrać żądany plik, następnie zapis w sesji że może i który, utworzenie linku.
2. link - user klika, następuje generacja pliku w locie, przesłanie go użytkownikowi z PHP (brak potrzeby usuwania)

wink.gif
Crozin
Nie możesz po prostu wysłać odpowiednich nagłówków (wymuszających "normalne" pobranie) oraz wyświetlić z poziomu PHP tych danych?
zaajcu
Cytat(Sephirus @ 19.12.2011, 10:22:03 ) *
Moja koncepcja 2 kroki:
1. ajax - sprawdzanie wszystkiego dotyczącego tego czy user może pobrać żądany plik, następnie zapis w sesji że może i który, utworzenie linku.
2. link - user klika, następuje generacja pliku w locie, przesłanie go użytkownikowi z PHP (brak potrzeby usuwania)




sprawdzanie czy user może pobrać mam bo jak nie będzie miał uprawnień do danego modułu to klasa go nie puści dalej. Nie wiem jak utworzyć ten plik w locie tak żeby się nie zapisał na dysku.

i nie wiem do końca jak zrobić z tym linkiem mam przycisk export xml i po kliknięciu na niege. leci post do handlera tam jest ladowana odpowiednia klasa i uruchamiana funkcja i z tej funkcji chciałbym wypluc plik i uruchumoic jego pobranie
Uriziel01
Ale z czego tworzysz ten plik ? To jest jakies generowane archiwum czy tez z bazy danych ? Poprostu zwracasz link do pliku który wyrzuca odpowiedni nagłówek i treść pliku. Możesz to zrobić nawet przez token jeżeli generowania tego pliku nie da się zautomatyzować i zapisywac w bazie dane opisujące ten token. Generujesz token i podpinasz pod niego odpowiednią zawartośc pliku, potem dajesz mu linke do np. pobierz.php?TOKEN_ID=123456789, tam skypt zwraca odpowiednie naglówki i treść. Po wszystkim usuwasz ten token z bazy (Jeżeli mają to być linki jednorazowe)
lukaskolista
Pobieranie plikow przez uzytkownikow to tak na prawde nie pobieranie plikow. Wykorzystuje sie do tego konkretne naglowki HTTP, dzieki ktorym przegladarka mysli ze otrzymala plik i rozpoczyna jego pobieranie. Zeby wyslac cokolwiec jako plik wcale nie musisz tworzyc tymczasowych plikow, wrecz bylo by to porazka.
zaajcu
Dane do pliku są pobierane z bazy danych. Generowanie będzie w pełni automatyczne zależne od jednej zmiennej.
Chciałem to zrobić bez otwierania nowego okna.
ale z tego co mówicie można by faktycznie zrobić normalny link do pliku download.php gdzie zostanie stworzony ten plik i jakieś tam nagłówki dodane. wink.gif

Teraz tylko pytanie jakie nagłówki i jak stworzyć zawartość pliku? Wystarczy normalne echo i zmiana nagłówka? i jak zmienić nazwę pliku?
Uriziel01
Przykład z jakiejś strony z google wink.gif
Musisz tylko podpiąć swoją zawartość do $filecontent i nazwe pliku do $downloadfile;
No i oczywiście 'Content-Type' musi odpowiadac faktycznemu plikowi.
(Od razu mówię że nie wiem czy ten skrypt zawiera jakies błedy, to nie mój kod)
  1. <?php
  2. $filecontent="Some text/code im creating in the script";
  3. $downloadfile="somefile.txt";
  4.  
  5. header("Content-disposition: attachment; filename=$downloadfile");
  6. header("Content-Type: application/force-download");
  7. header("Content-Transfer-Encoding: binary");
  8. header("Content-Length: ".strlen($filecontent));
  9. header("Pragma: no-cache");
  10. header("Expires: 0");
  11.  
  12. ?>
zaajcu
Dzięki za chwile się za to wezmę wink.gif

Cytat(Uriziel01 @ 19.12.2011, 10:51:01 ) *
Przykład z jakiejś strony z google wink.gif
Musisz tylko podpiąć swoją zawartość do $filecontent i nazwe pliku do $downloadfile;
No i oczywiście 'Content-Type' musi odpowiadac faktycznemu plikowi.
(Od razu mówię że nie wiem czy ten skrypt zawiera jakies błedy, to nie mój kod)
  1. <?php
  2. $filecontent="Some text/code im creating in the script";
  3. $downloadfile="somefile.txt";
  4.  
  5. header("Content-disposition: attachment; filename=$downloadfile");
  6. header("Content-Type: application/force-download");
  7. header("Content-Transfer-Encoding: binary");
  8. header("Content-Length: ".strlen($filecontent));
  9. header("Pragma: no-cache");
  10. header("Expires: 0");
  11.  
  12. ?>


wszystko prawie fajnie tylko potrzebuje zeby do pliku mi zapisało taką treść:

  1.  
  2. <model nart="40020710" typ="TD-160/100 N SILENT" bieg="HS" uv="230" no="2500" pw="25" pwmin="" ia="0.16" qm="180" ps="105" tmin="-20" tmax="40" mk="1.4" fi="100" fio="97" dba="24" reg="REB-1" name="" />


a z tym jest mały problem bo nie wyświetle tego na stronie ze względu na <> jak je pozamieniam na &lt; &gt; to niestety ale te znaczniki tam lądują :/

jak można to obejść

zrobiłem tak:

  1. $file = "modele.$g->typ";
  2. $file = fopen($file, 'w+');
  3. fwrite($file, $filecontent,strlen($filecontent));
  4. fclose($file);
  5.  
  6. header("Location: modele.xml");


utworzyłem sobie jeden plik który będzie zawsze pobierany i zrobiłem hedera na niego ale niestety zamiast mi się on pobrać to mi się on wyświetla w przeglądarce :/
nie wiem jaki nagłówek dorzucić żeby się pobrał chyba że macie inny pomysł na to.
adbacz
Z tego co wiem, to musisz dać przeglądarce do zrozumienia, że to plik pobieralny header("Content-Type: application/force-download");, i nie dawać żadnego jego typu MIME. W tedy przeglądarka uzna, że nie otworzy tego pliku, więc da userowi mozliwość pobrania pliku. Ja u siebie mam cos takiego i działa, bez względu na to jaki to plik:

  1. $name = basename($path);
  2.  
  3. $size = filesize($path);
  4.  
  5. header( 'Pragma: public' );
  6. header( 'Pragma: no-cache' );
  7. header( 'Expires: 0' );
  8. header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
  9. header( 'Cache-Control: public ');
  10. header( 'Content-Description: File Transfer' );
  11.  
  12. header( 'Content-Type: application/force-download' );
  13.  
  14. header( 'Content-Disposition: attachment; filename=\"'.$name.'\"' );
  15. header( 'Content-Disposition: attachment; filename='.$name );
  16.  
  17. header( 'Content-Transfer-Encoding: binary' );
  18. header( 'Content-Length: '.$size );
  19.  
  20. readfile($path);
adrian512
Odkopię troszkę temat.

Pomoże ktoś jak wysłać dwa pliki?
Pyton_000
Nie da się wysłać 2 plików.
Musisz spakować na serwerze i wysłać spakowany.
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.