Ako vratit File z AJAX requestu?

steelbull
Člen | 241
+
0
-

Chcem zo servera stiahnuť viacero súborov naraz. Zipnem ich na servri a dostanem jeden ZIP, ktorý chcem stiahnuť. Uvažoval som, že IDčka súborov, ktoré potrebujem si odošlem AJAXom a naspäť by som chcel dostať súbor pre stiahnutie.

Chcel som to urobiť takto, ale také jednoduché to asi nebude.

Mám nasledujúci AJAX request pre testovanie:

<script n:syntax="double">
	$("#download").click(function(e) {

		var info = [];
		info[0] = 'hi';
		info[1] = 'hello';


		$.ajax({
			type: "POST",
			data: {info:info},
			url: {{plink download!}},
			success: function(msg){
				// Namiesto toho chcem vratit file
				$('.answer').html(msg);
			}
		});


	});
</script>

V Nette som vytvoril nasledujúci handle.

public function handleDownload() {
		if($this->isAjax()) {
			$this->sendResponse(new FileResponse("C:/test.txt"));
		}
}

Request prebehne, dostanem odpoveď, ale nie súbor.

jazby
Člen | 44
+
+2
-

No jestli na to spíš nejdeš špatně. Ajax neslouží na stahování souborů. Možností máš vícero.

  1. buď to neposílej ajaxem ale klasickým requestem, protože zpětný volání FileResponse ti neudělá redirect ⇒ jen vyhod ten ajax a nahraď ho klasickým {link…}.
  2. pokud trváš na ajaxu, musíš to udělat tak, že si pošleš ty IDčka, na serveru si uděláš zip (což máš) a zpátky do ajaxu si pošleš cestu k vygenerovanému souboru. Na straně javascriptu si potom buď ten získaný odkaz předáš do nějakého odkazu „Stáhnout soubor“, nebo na něj redirectneš do nového okna.

Ale teda ajax a stahování souborů spíš ne-e vol radši cestu 1.

steelbull
Člen | 241
+
0
-

Možno triviálna otázka, ale neviem, ako si mam v url predat pole idciek do requestu.

jazby napsal(a):

No jestli na to spíš nejdeš špatně. Ajax neslouží na stahování souborů. Možností máš vícero.

  1. buď to neposílej ajaxem ale klasickým requestem, protože zpětný volání FileResponse ti neudělá redirect ⇒ jen vyhod ten ajax a nahraď ho klasickým {link…}.
  2. pokud trváš na ajaxu, musíš to udělat tak, že si pošleš ty IDčka, na serveru si uděláš zip (což máš) a zpátky do ajaxu si pošleš cestu k vygenerovanému souboru. Na straně javascriptu si potom buď ten získaný odkaz předáš do nějakého odkazu „Stáhnout soubor“, nebo na něj redirectneš do nového okna.

Ale teda ajax a stahování souborů spíš ne-e vol radši cestu 1.

Editoval steelbull (25. 2. 2018 13:48)

Alis
Člen | 7
+
0
-

Ahoj, řeším stejný problém. Jen potřebuji ajax, jelikož sbírám různé údaje přes javascript (idečka skupin, názvy souborů).

Mám zatím:

<script>
        $.nette.ajax({
            type: 'GET',
            url: {link export!}, // volam handleexport
            data: data,
            contentType: "application/json; charset=utf-8",
            success: function (response) {
                    window.location = response; // chci presmerovat stranku a dostat zip
            }});
</script>
<?php
function handleexport(){
		$zip = new \ZipArchive();
        $filename = "neco.zip";
        if ($zip->open($filename, \ZipArchive::CREATE) !== TRUE) {
            exit("cannot open <$filename>\n");
        }
        $zip->addFromString('soubor.txt', 'Nejaký text');
        $zip->close();
 		$this->sendResponse($filename);
}
?>

Dostávám samozřejmě chybu: Argument 1 passed to Nette\Application\UI\Presenter::sendResponse() must be an instance of Nette\Application\IResponse

Jak dokážu poslat filename?
Děkuji za každou radu.

David Matějka
Moderator | 6445
+
0
-

muzes poslat JsonResponse, respektive pomoci sendJson

ale spise bych zkusil namisto AJAX pozadavku sestavit javascriptove tu URL s export! a datama a provest redirect na ni

Alis
Člen | 7
+
0
-

ad první možnost když dám sendJson, převede mě to na url neco/neco.zip s chyba 404 Objekt nenalezen

ad druhá možnost myslíš nějak pomocí window.location? Poradil bys prosím, jak to správně složit?

Děkuji.

manwe
Člen | 44
+
0
-

@Alis

priklad pouziti

v Latte mam

<a n:href="setExportCustom! weekId => 'WEEKID', amount => 'AMT'" id="exportCustomValueLink"></a>

<script type="text/javascript">
function plannerSaveCustomValue(){
        var input = $('.planner-week-table').find('.custom-value');
        if(input.length > 0) {
			var week = input.data('week');
            var link = $('#exportCustomValueLink').prop('href');
            link = link.replace('WEEKID', week).replace('AMT', amount);
            $.nette.ajax({ url: link });
        }
    }
</script>

tak si zavolam Nette handle pomoci ajaxu s nejakymi parametry ktere mam v inputu… popr. pokud nechces ajax ale redirect tak misto $.nette.ajax das window.location.href = link

Kdyz to zavolas pomoci Nette.ajaxu a ne „cisteho“ ajaxu tak ti pujde podle me i stahnout ten soubor. Pokud ne, tak pouzij ten window.location.href

Editoval raddy668 (11. 3. 2019 9:33)