Servera pusē man ir Struts2 darbība failu lejupielādei.
<action name="download" class="com.xxx.DownAction">
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">imageStream</param>
<param name="contentDisposition">attachment;filename={fileName}</param>
<param name="bufferSize">1024</param>
</result>
</action>
Tomēr, kad es izsaucu darbību, izmantojot jQuery:
$.post(
"/download.action",{
para1:value1,
para2:value2
....
},function(data){
console.info(data);
}
);
Firebug es redzu, ka dati tiek iegūti ar Binary stream. Mani interesē, kā atvērt faila lejupielādes logu, ar kuru lietotājs var saglabāt failu lokāli?
2019. gada moderno pārlūkprogrammu atjauninājums
Šādu pieeju es tagad ieteiktu ar dažiem iebildumiem:
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(resp => resp.blob())
.then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
// the filename you want
a.download = 'todo-1.json';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
alert('your file has downloaded!'); // or you know, something with better UX...
})
.catch(() => alert('oh no!'));
2012 Oriģinālā jQuery/iframe/Cookie pieeja
Bluish ir pilnīga taisnība, jūs nevarat to darīt ar Ajax palīdzību, jo JavaScript nevar saglabāt failus tieši lietotāja datorā (drošības apsvērumu dēļ). Diemžēl, norādot galvenā loga URL uz jūsu faila lejupielādes adresi, jums ir maza kontrole pār to, kāda ir lietotāja pieredze, kad notiek faila lejupielāde.
Es izveidoju jQuery File Download, kas ļauj "Ajax like" pieredzi ar failu lejupielādi, kas papildināta ar OnSuccess un OnFailure izsaukumiem, lai nodrošinātu labāku lietotāja pieredzi. Aplūkojiet manu bloga ierakstu par biežāk sastopamo problēmu, ko šis spraudnis atrisina, un dažus tā izmantošanas veidus, kā arī jQuery File Download demo. Šeit ir avots.
Šeit ir vienkāršs izmantošanas gadījuma demonstrējums, kurā izmanto spraudni avots ar solījumiem. Demo lapā ir arī daudzi citi, 'labāki UX' piemēri.
$.fileDownload('some/file.pdf')
.done(function () { alert('File download a success!'); })
.fail(function () { alert('File download failed!'); });
Atkarībā no tā, kādas pārlūkprogrammas jums ir jāatbalsta, jūs, iespējams, varēsiet izmantot https://github.com/eligrey/FileSaver.js/, kas nodrošina skaidrāku kontroli nekā jQuery File Download izmantotā IFRAME metode.
Neviens nav ievietojis šo @Pekka's risinājums... tāpēc es to publicēšu. Tas var kādam palīdzēt.
Tas nav jādara, izmantojot Ajax. Vienkārši izmantojiet
window.location="download.action?para1=value1...."
1. Agnostisks ietvars: Servlets, kas lejupielādē failu kā pielikumu
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: Darbība, lejupielādējot failu kā pielikumu
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Labāk būtu izmantot <s:a>
tagu, kas ar OGNL norāda uz URL, kas izveidots ar <s:url>
tagu:
<!-- without JS, with Struts tags: THE RIGHT WAY -->
<s:url action="downloadAction.action" var="url">
<s:param name="param1">value1</s:param>
</s:ulr>
<s:a href="%{url}" >download</s:a>
Iepriekšminētajos gadījumos jums jā atbildē ieraksta Content-Disposition galveni, norādot, ka fails ir jālejupielādē (pielikums
), nevis jāatver pārlūkprogrammā (inline
). Ir jānorāda arī Content Type* (satura tips), un, iespējams, ir jānorāda arī faila nosaukums un garums (lai palīdzētu pārlūkprogrammai zīmēt reālu progresa joslu).
Piemēram, lejupielādējot ZIP:
response.setContentType("application/zip");
response.addHeader("Content-Disposition",
"attachment; filename=\"name of my file.zip\"");
response.setHeader("Content-Length", myFile.length()); // or myByte[].length...
Ar Struts2 (ja vien jūs neizmantojat darbību kā Servlet, hack tiešai straumēšanai, piemēram), jums nav nepieciešams neko tieši ierakstīt atbildē; vienkārši izmantojot Stream result type un konfigurējot to struts.xml, tas darbosies: PIEMĒRSIS
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="contentLength">${fileLength}</param>
</result>
3. Sistēmas agnosticitāte (/ Struts2 sistēma): Servlet(/Action), atverot failu pārlūkprogrammā.
Ja vēlaties atvērt failu pārlūkprogrammā, nevis lejupielādēt to, Content-disposition ir jāiestata uz inline, bet mērķis nevar būt pašreizējā loga atrašanās vieta; jums ir jāvēršas uz jaunu logu, kas izveidots ar javascript, <iframe>
lapā, vai jaunu logu, kas izveidots uzreiz, izmantojot "discussed" target="_blank":
<!-- From a parent page into an IFrame without javascript -->
<a href="downloadServlet?param1=value1" target="iFrameName">
download
</a>
<!-- In a new window without javascript -->
<a href="downloadServlet?param1=value1" target="_blank">
download
</a>
<!-- In a new window with javascript -->
<a href="javascript:window.open('downloadServlet?param1=value1');" >
download
</a>