Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][PHP] jak Ajaxem po przesłaniu danych zapisać plik na dysk użytkownika?
Forum PHP.pl > Forum > Przedszkole
jhoihkjhkhnkh
Teraz robię taką głupawkę, że po naciśnięciu przycisku najpierw idzie Ajax gdzie na podstawie parametrów tworzę plik na serwerze, a potem idzie normalny request gdzie w odpowiedzi zapisuję plik na dysku usera. Wolałbym to robić tylko ajaxem.

teraz jest tak:

  1.  
  2.  
  3. if (//wchodzi ajax){
  4. //wygeneruj plik i zapisz nazwę w sesji
  5. }
  6.  
  7. if(//wchodzi zwykły request){
  8. //odbierz z sesji nazwę pliku i ...
  9. header('Content-Description: File Transfer');
  10. header("Content-type: text/csv; charset=utf-8");
  11. header('Content-Disposition: attachment; filename=' . basename($exportedFile));
  12. header('Content-Transfer-Encoding: binary');
  13. header('Expires: 0');
  14. header('Cache-Control: must-revalidate');
  15. header('Pragma: public');
  16. header('Content-Length: ' . filesize($exportedFile));
  17. flush();
  18. readfile($exportedFile);
  19. unlink($exportedFile);
  20. }
  21.  



i wcześniej ajax

  1. <a href="?action=exp" id="export">
  2. </a>
  3. <script type="text/javascript">
  4. $("#export").click(function () {
  5. $.ajax({
  6. url: "../admin/shop.php",
  7. data: {
  8. action: 'exp',
  9. tableParams: tableParams
  10. }
  11. })
  12. });



Problem polega na tym, że zdarza się że szybszy jest request "zwykły" a potem idzie ajax. Mogłoby tak zostać ale musiałbym jakoś zmusić by najpierw szedł ajax a po nim zwykły request. Muszę to robić ajaxem bo dane na podstawie którym mam wygenerować plik są widoczne tylko przez javascript
nospor
Jak sobie wyobrazasz, ze skrypt php bedacy na serwerze zapisze sam z siebie plik na komputerze uzytkownika? Magic?

Cytat
Problem polega na tym, że zdarza się że szybszy jest request "zwykły" a potem idzie ajax. Mogłoby tak zostać ale musiałbym jakoś zmusić by najpierw szedł ajax a po nim zwykły request.
No to wysylaj zwykly request dopiero gdy AJAX sie skonczy. Masz przeciez zdarzenie onsuccess dla AJAXow i wiesz kiedy sie skonczyly
jhoihkjhkhnkh
Cytat(nospor @ 23.08.2017, 12:53:57 ) *
No to wysylaj zwykly request dopiero gdy AJAX sie skonczy. Masz przeciez zdarzenie onsuccess dla AJAXow i wiesz kiedy sie skonczyly

zrobiłem tak:

  1. $("#export").click(function () {
  2. $.ajax({
  3. url: "../admin/shop.php",
  4. data: {
  5. action: 'exp',
  6. tableParams: tableParams
  7. },
  8. success: function() {
  9. $.get( "//export()" );
  10. }
  11. })
  12. });


przy debugowaniu widzę jak za drugim razem wpada w ten fragment kodu (który wcześniej skutecznie zapisywał plik na dysk usera) gdzie ustawiany jest header (i w trakcie debugowania widzę że ten plik istnieje na serwerze)
  1. header('Content-Description: File Transfer');
  2. header("Content-type: text/csv; charset=utf-8");
  3. header('Content-Disposition: attachment; filename=' . basename($exportedFile));
  4. header('Content-Transfer-Encoding: binary');
  5. header('Expires: 0');
  6. header('Cache-Control: must-revalidate');
  7. header('Pragma: public');
  8. header('Content-Length: ' . filesize($exportedFile));
  9. flush();
  10. readfile($exportedFile);
  11. unlink($exportedFile);

ale finalnie nie zapisuje żadnego pliku na dysk usera.
nospor
Toz mowiles, ze drugi to jest zwykly request a teraz w kodzie widze ze drugi to jest tez ajax i na dodatek jakis dziwny :/
$.get( "//export()" );
jhoihkjhkhnkh
Mówiłeś bym on success wysłał zwykły request, tom dodał ten $.get( "//export()" );

Aha, drugi request "zwykły" w sensie tu oba requesty są związane z tym samym przyciskiem (<a><button>) i to samo naciśnięcie wywołuje ajax a potem zwykły request bo w ajaxie nie wyłączam zachowania tego przycisku.
nospor
No to wylacz zachowanie tego przycisku.
Drugi zwykly request (nie AJAX) masz zrobic dopiero gdy pierwszy (AJAX) sie zakonczy
jhoihkjhkhnkh
nie rozumiem

wysyłam drugi request gdy pierwszy się skończył (success)
A jak wysłać zwykły request bez kolejnego klikania w bloku success?
Pyton_000
window.location.replace('?action=export');
jhoihkjhkhnkh
też nie zapisuje pliku
  1. $("#export").click(function () {
  2. $.ajax({
  3. url: "../admin/shop-products.php",
  4. data: {
  5. action: 'exp',
  6. tableParams: tableParams
  7. }
  8. }).success(function(){
  9. window.location.replace('?action=export');})
  10. });
nospor
@Pyton uzyl za duzego skrotu myslowego...

document.location.href='?action=exp';
jhoihkjhkhnkh
allah akhbar, działa!
jhoihkjhkhnkh
(edit: działa)

jasna cholera, lokalnie działa, ale na serwerze już nie.

już wkleję całość by nie było wątpliwości

  1. function export()
  2. {
  3. $tableParams = $_GET['tableParams'] questionmark.gif false;
  4. if (!$session->get('csvFile') and !$tableParams){
  5. showList();
  6. }
  7.  
  8. if (!$session->get('csvFile') and $tableParams){
  9. // $session->set('csvFile')
  10. }
  11.  
  12. if($session->get('csvFile')) {
  13. $exportedFile = $session->get('csvFile');
  14. unset($_SESSION['csvFile']);
  15. //zapis pliku na dysk lokalny usera, wg https://stackoverflow.com/a/11316004/6827096
  16. header('Content-Description: File Transfer');
  17. header("Content-type: text/csv; charset=utf-8");
  18. header('Content-Disposition: attachment; filename=' . basename($exportedFile));
  19. header('Content-Transfer-Encoding: binary');
  20. header('Expires: 0');
  21. header('Cache-Control: must-revalidate');
  22. header('Pragma: public');
  23. header('Content-Length: ' . filesize($exportedFile));
  24. flush();
  25. readfile($exportedFile);
  26. unlink($exportedFile);
  27. }
  28. }


  1. <a href="" id="export">
  2. <button >
  3. </button>
  4. </a>
  5. <script type="text/javascript">
  6. $("#export").click(function () {
  7. $.ajax({
  8. url: "//export()",
  9. data: {
  10. action: 'exp',
  11. tableParams: tableParams
  12. }
  13. }).success(function(){
  14. document.location.href='?action=exp';
  15. })
  16. });
  17. </script>




edit:

zmieniłem
<a href="" id="export"><button ></button></a>

na
<p id="export"></p>

i chwilowo działa.
Pyton_000
$("#export").click(function (e) {
e.preventDefault();
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.