Ako vratit File z AJAX requestu?
- steelbull
- Člen | 241
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
No jestli na to spíš nejdeš špatně. Ajax neslouží na stahování souborů. Možností máš vícero.
- 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…}.
- 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
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.
- 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…}.
- 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
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
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
- manwe
- Člen | 44
@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)