Pero me lanza el error "getOutputStream() ya ha sido llamado para esta respuesta". He revisado el código y no tengo más que una sola llamada a ese método, y no entiendo por qué me salta. ¿Alguien podría ayudarme?
Este es el código que lanza la excepción:
Código PHP:
package biblioteca.registrados.archivos;
import biblioteca.factory.ArchivosDAO;
import biblioteca.factory.MysqlDAOFactory;
import biblioteca.sesion.ArchivoVO;
import biblioteca.sesion.ProyectoVO;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
/**
* Maneja la lógica de negocio para descargar el archivo asociado a un Proyecto de Fin de Carrera.
*
* @poseidon-object-id [Im20e52fem10f92dd2f0amm7df1]
* @author David Rguez.
*/
public class DescargaFicheroBean {
/**
*
*
* @poseidon-object-id [Im20e52fem10f92dd2f0amm65fb]
* @return
* @param req
* @param res
*/
public synchronized ActionMessages descargar(HttpServletRequest req, HttpServletResponse res) {
// Variables
HttpSession sesion = req.getSession();
ActionMessages errores = null;
Collection archivos = (Collection)sesion.getAttribute("losFicheros");
ArchivoVO archivo = null;
int id = Integer.parseInt(req.getParameter("id"));
int contador = 0;
int bytesLeidos = 0;
byte[] buffer = new byte[8192];
try {
// Recuperamos la ruta
Iterator arch = archivos.iterator();
while (contador < id){
contador++;
archivo = (ArchivoVO) arch.next();
}
String ruta = archivo.getRuta();
int tamaño = archivo.getTamaño();
String nombre = archivo.getNombreArchivo();
// Completamos la ruta
String rutaCompleta = sesion.getServletContext().getRealPath(ruta);
// Recuperamos el contenido del archivo al que apunta la ruta y lo colocamos en la respuesta
// También rellenamos el resto de información
res.setContentLength(tamaño);
res.setContentType("APPLICATION/OCTET-STREAM");
//res.setContentType("application/x-file-download");
res.setHeader("Content-disposition", "attachment; filename=\"" + nombre+"\"");
ServletOutputStream salida = res.getOutputStream();
FileInputStream descarga = new FileInputStream(rutaCompleta);
while ((bytesLeidos = descarga.read(buffer, 0, 8192)) != -1) {
salida.write(buffer, 0, bytesLeidos);
}
salida.flush();
salida.close();
descarga.close();
return null;
}catch (Exception e) {
if (errores == null)
errores = new ActionMessages();
errores.add("errorGeneral",new ActionMessage("error.general"));
return errores;
}
}
}