2010-01-23 53 views
8

Quiero descargar archivos usando java, struts2 y ajax.Descarga de archivos usando Java, Struts 2 y AJAX

En mi página html hay un botón llamado "exportar" que hace clic en la llamada ajax que se ejecutará y ejecutará una consulta y creará el archivo .xls utilizando el código y quiero transferir ese archivo al usuario sin almacenarlo en el disco duro.

¿Alguien sabe cómo hacer eso usando struts2 y ajax en java?

¿Hay algún ejemplo disponible?

Déjeme saber si usted necesita más detalles de mí ...

Gracias.

amar4kintu

Respuesta

11

Usted no tiene que utilizar AJAX en este caso. Simplemente haga que su botón envíe el formulario a su acción de Struts y haga que la acción use el tipo stream result.

Ejemplo:

En el código XML puntales:

<result name="download" type="stream"> 
    <param name="contentDisposition">attachment;filename=report.xls</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="inputName">inputStream</param> 
    <param name="bufferSize">1024</param> 
</result> 

Su acción a su vez permitirá una public InputStream getInputStream() a pasar a lo largo de los datos.

Supongo que cualquier biblioteca que esté utilizando para generar los archivos de Excel (POI?) Puede escribir la salida en un OutputStream arbitrario.

Una manera rápida y sucia-convertir eso a un InputStream: atlast

// Using Workbook from Apache POI for example... 
Workbook wb; 
// ... 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
wb.write(bos); 
InputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
+0

Hola, me puso en mi follwing struts.xml \t \t \t \t \t CONTENTTYPE application/vnd.ms-excel \t \t \t \t \t \t filestream \t \t \t \t \t \t unión; nombre de archivo = Informe.xls \t \t \t \t \t \t 1024 \t \t Ahora he seguido sus instrucciones, pero da el archivo para descargar con nombre de acción que es ExportReport.action en lugar de report.xls Entonces, ¿cuál debería ser el motivo? – amar4kintu

+0

Entonces, ¿estabas usando MSIE? O bien, pasa el nombre de archivo junto con URL pathinfo o utiliza un navegador web mejor. – BalusC

+0

Estoy usando firefox y debería darme un archivo descargado como report.xls pero me da ExportReport.action para descargar. y si cambio el nombre a report.xls. Muestra el archivo .xls perfecto que estoy exportando .. ¿Alguien puede decir qué me estoy perdiendo? – amar4kintu

0

, yo era capaz de resolverlo de la siguiente manera .. que escribí siguiente línea en mi función de la clase de acción y estaba capaz de descargar el archivo con el nombre report.xls en lugar de ExportReport.action. No sé exactamente ... ¿por qué?

response.setHeader("Content-Disposition","attachment;filename=rpt.xls"); 

Lo que sigue está en mi archivo struts.xml. Eliminé <contentDispositin> param de él porque no estaba funcionando desde el archivo struts.xml y lo puse en mi archivo de acción de Java como el anterior.

<result name="success" type="stream" > 
    <param name="inputName">fileStream</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="bufferSize">1024</param> 
</result> 

Espero que esto ayude a alguien.

Gracias.

amar4kintu

0

que haría uso de este tipo de anotación en la clase Action:

@Result(name = "success", type= StreamResult.class, 
      params = {"contentType", "application/vnd.ms-excel", 
        "contentDisposition", "attachment; filename=report.xls"}, 
      value = "reportFileStream" 
) 
2

Como seguimiento a la pregunta de amar4kintu con respecto a los archivos guardados como ExportReport.action en lugar de Informe.xls, esto sucede en IE si no se sigue el siguiente formato en sus puntales.archivo xml:

<result name="download" type="stream"> 
     <param name="contentDisposition">attachment;filename="${flashcardSetBean.title}.xlsx"</param> 
     <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param> 
     <param name="inputName">inputStream</param> 
     <param name="bufferSize">1024</param> 
</result> 

Parece que la línea contentDisposition en particular, debe indicar que el archivo es un archivo adjunto y que el nombre del archivo está rodeado por comillas.

2

sólo para su referencia, podemos hacer lo mismo usando Anotación:

public class MyAction { 
    private InputStream fileInputStream; 
    private String logoName; 

    @Action(value="/downloadLogo", 
     results={ 
      @Result(name="success", type="stream", 
      params = { 
        "contentType", "application/image/gif", 
        "inputName", "fileInputStream", 
        "contentDisposition", "filename=\"${logoName}\"", 
        "bufferSize", "1024" 
      }) 
     }   
    )  
    public String downloadLogo() throws Exception { 
     logoName = "test.jpg"; 
      fileInputStream = new FileInputStream(new File("DirePath", logoName)); 
    } 
} 
0

Un mejor enfoque para outStream tubería a un flujo de entrada se explica a continuación as opposed to the response by ZoogieZork above

InputStream is = new PipedInputStream(); 
PipedOutputStream out = new PipedOutputStream((PipedInputStream) is); 
wb.write(out); 

La ventaja de este método es que todo el buffer no se almacena en la memoria, sino que se canaliza utilizando un pequeño buffer circular interno. Esto es mejor tanto en términos de memoria como de sobrecarga de CPU.

Referencia: Convert a Java OutputStream to an InputStream

Cuestiones relacionadas