PDA

View Full Version : [JAVA + AJAX] Scaricare un file con AJAX da una servlet


VegetaSSJ5
07-12-2011, 20:05
Salve a tutti!
Ho una servlet che si occupa di gestire le richieste AJAX. Il problema č che non riesco a implementare la funzione di download di un file via AJAX. Sulla pagina web ho un pulsante con la funzione javascript download registrata per l'evento onclick:function ajaxRequest(method, parameters) {
var XMLHttpReq;
try {
XMLHttpReq = new XMLHttpRequest();
} catch (e) {
try {XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP.6.0");} catch(e) {}
try {XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP.3.0");} catch(e) {}
try {XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {}
try {XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");}
catch(e) {return "!!AJAXERROR!!Impossibile creare una richiesta AJAX.";}
}

var strRequestParams = "";
if (isArray(parameters)) {
for (var i = 0; i < parameters.length; i++) {
strRequestParams = strRequestParams + "&" + parameters[i];
}
} else if (isHash(parameters)) {
var keys = parameters.getKeys();
for (var i = 0; i < keys.length; i++) {
strRequestParams = strRequestParams + "&" + keys[i] + "=" + parameters[i];
}
} else {
strRequestParams = parameters;
}

XMLHttpReq.open("post", getBaseURL()+"ajaxrequest.do", false);
XMLHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
XMLHttpReq.send("method="+method+strRequestParams);
return XMLHttpReq.responseText;
}

function downloadFile(idDocumento) {
var ajaxResponse = ajaxRequest("downloadFile", new Array("idDocumento="+idDocumento));
alert(ajaxResponse);
}
Tale funzione richiama la servlet che esegue il metodo seguente:private void downloadFile() {
try {
long idDocumento = Long.parseLong(request.getParameter("idDocumento"));
GeScuolaOperations gso = GeScuolaServiceFactory.getInstance().getGeScuolaService();
Documento doc = gso.getDocDetails(new Documento(idDocumento));
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=\"" + doc.getNome() + "\"");
response.setIntHeader("Content-Length", doc.getContenuto().length);
response.getOutputStream().write(doc.getContenuto());
} catch (Throwable t) {
sendErrorResponse(t);
}
return;
}
Sul client ricevo nell'alert il contenuto del file, perņ non mi appare la finestra per salvare il file.
Sapete dirmi come posso realizzare questa cosa?

Grazie!

VegetaSSJ5
09-12-2011, 23:55
Mi rispondo da solo.
Forse i browser non hanno ancora implementato (magari volutamente) il download di file da una richiesta AJAX.
Per risolvere č bastato aprire una nuova pagina popup tramite javascript con la window.open per scaricare il file.
Per completezza metto il codice della funzione javascript.function downloadFile(idDocumento) {
window.open(getBaseURL()+"ajaxrequest.do?method=downloadFile&idDocumento="+idDocumento, "Download documento", "location=no,menubar=no,resizable=no,titlebar=no,toolbar=no");
}