¿Cómo acceder al servlet y descargar el archivo adjunto?

Tengo el siguiente fragmento de código que intenta realizar una llamada HTTP a mi servlet:

    try {
        // Construct data
        String data = URLEncoder.encode("rpt_type", "UTF-8") + "=" + URLEncoder.encode(reportType, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_project", "UTF-8") + "=" + URLEncoder.encode(reportProject, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_mrv_creator", "UTF-8") + "=" + URLEncoder.encode(reportMrvCreator, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_gi_recipient", "UTF-8") + "=" + URLEncoder.encode(reportGiRecipient, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_plant", "UTF-8") + "=" + URLEncoder.encode(reportPlant, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_sloc", "UTF-8") + "=" + URLEncoder.encode(reportStorageLoc, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_gi_no", "UTF-8") + "=" + URLEncoder.encode(reportGiNo, "UTF-8");
        data += "&" + URLEncoder.encode("date_sap_gi_fr", "UTF-8") + "=" + URLEncoder.encode(reportDateGiFrom, "UTF-8");
        data += "&" + URLEncoder.encode("date_sap_gi_to", "UTF-8") + "=" + URLEncoder.encode(reportDateGiTo, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_partno", "UTF-8") + "=" + URLEncoder.encode(reportPartNo, "UTF-8");
        data += "&" + URLEncoder.encode("rpt_so_no", "UTF-8") + "=" + URLEncoder.encode(reportSvcOrderNo, "UTF-8");
        data += "&" + URLEncoder.encode("date_scan_fr", "UTF-8") + "=" + URLEncoder.encode(reportDateScanFrom, "UTF-8");
        data += "&" + URLEncoder.encode("date_scan_to", "UTF-8") + "=" + URLEncoder.encode(reportDateScanTo, "UTF-8");
        System.out.println("[data]\n" + data);

        // Send data
        String urlString = "http://localhost:8080/aerobook/GIStatusReportDownload?" + data;
        System.out.println("[url] " + urlString);
        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        //conn.setDoOutput(true);
        //OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        //wr.write(data);
        //wr.flush();

        // Get the response
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            System.out.println(line);
        }
        //wr.close();
        rd.close();
    } catch (Exception e) {
    }

Mi salida de depuración:

[data]
rpt_type=d&rpt_project=aaa&rpt_mrv_creator=bbb&rpt_gi_recipient=ccc&rpt_plant=ddd&rpt_sloc=eee&rpt_gi_no=fff&date_sap_gi_fr=02%2F05%2F2012&date_sap_gi_to=03%2F05%2F2012&rpt_partno=ggg&rpt_so_no=hhh&date_scan_fr=26%2F05%2F2012&date_scan_to=31%2F05%2F2012
[url] http://localhost:8080/aerobook/GIStatusReportDownload?rpt_type=d&rpt_project=aaa&rpt_mrv_creator=bbb&rpt_gi_recipient=ccc&rpt_plant=ddd&rpt_sloc=eee&rpt_gi_no=fff&date_sap_gi_fr=02%2F05%2F2012&date_sap_gi_to=03%2F05%2F2012&rpt_partno=ggg&rpt_so_no=hhh&date_scan_fr=26%2F05%2F2012&date_scan_to=31%2F05%2F2012

En mi servlet (en un archivo separado del código anterior), genero un archivo de Excel para descargar:

    res.setContentType(sContentType);
    res.setHeader("Content-Disposition", "attachment;filename=\"" + sExcelFileName + "\"");
    OutputStream oOutStrm = res.getOutputStream();
    wbBook.write(oOutStrm);
    oOutStrm.close();

Mi problema aquí es que desde la URL generada por mi código (como se muestra en la salida de depuración anterior), puedo acceder a mi servlet y logro obtener el cuadro de diálogo Guardar como.

Me gustaría obtener el contenido del archivo generado para usarlo dentro de mi código. ¿Hay alguna forma de obtener el archivo adjunto de mi código, en un flujo de bytes o en cualquier otro formato?


Edición n. ° 3: limpió la parte superior

preguntado el 03 de mayo de 12 a las 12:05

¿Revisaste tu URL en el navegador? -

Sí, lo hice. En mi segmento de código anterior, System.out.println(data); produjo la cadena key1=value1&key2=value2. Lo que hice fue agregar "?" a mi URL, seguido de esta cadena. El resultado que obtuve fue http://localhost/MyProject/MyServlet?key1=value1&key2=value2. Ingresé esto en la barra de direcciones del navegador, pude descargar mi archivo de Excel. Quiero obtener el contenido del archivo de Excel en mi código, pero hasta ahora no funciona. -

Proporcione un fragmento de código de wbBook.write() método -

@Quio Busqué el enlace y probé el código interno. No funcionó =/ -

4 Respuestas

Cuando ingresa el URI en el navegador, está realizando una solicitud GET. Sin embargo, el código Java de su cliente produce una solicitud POST y envía los parámetros en el cuerpo, no el URI.

Es posible que desee ver un seguimiento HTTP y comparar.

contestado el 03 de mayo de 12 a las 13:05

¡Esto suena razonable! No estoy seguro de cómo hacer un seguimiento HTTP, pero ¿cómo hago para hacer una solicitud GET en mi código Java? - oh, sí

Re: edición n.º 2, creo que mi código está realizando una solicitud GET ahora, pero no, sigue sin funcionar. oh, sí

I want to get the contents of the excel file on my code, but so far it's not working.

No encuentro errores en el código.
Creo que desea convertir el contenido del flujo de entrada a un HSSFWorkbook objeto.
El siguiente fragmento de código lo ayudará.

java.net.URLConnection conn = url.openConnection();  
java.io.InputStream is = conn.getInputStream();  
org.apache.poi.hssf.usermodel.HSSFWorkbook workBook = new org.apache.poi.hssf.usermodel.HSSFWorkbook( is );  
System.out.println( "Number of Sheets: " + workBook.getNumberOfSheets() );  
org.apache.poi.hssf.usermodel.HSSFSheet sheet = workBook.getSheetAt( 0 );  
System.out.println( "Sheet Name: " + sheet.getSheetName() );  

// rest of your code to handle the captured workBook
// cheers

contestado el 03 de mayo de 12 a las 15:05

Consulta wbBook.write(oOutStrm); si se ha escrito algo en outputStream, también necesita llamar oOutStrm.flash() antes de cerrarlo.

contestado el 03 de mayo de 12 a las 13:05

Estoy muy seguro de que hay datos escritos en él. Como mencioné en mi pregunta, cuando accedo a mi servlet a través de la URL, aparece un cuadro de diálogo Guardar como y puedo guardar el archivo. Sin embargo, no puedo replicar esto en mi código. - oh, sí

envías esto URL url = new URL("http://localhost/MyProject/MyServlet"); de su código, sin ningún parámetro, que no es el mismo que escribió en el navegador. - user1335794

Las tres líneas después conn.setDoOutput(true); se supone que deben enviar los datos a mi servlet, ¿no? ¿O me estoy perdiendo algo aquí? - oh, sí

No le gusta lo que pensabas. Intente enviar la misma URL que escribió en el navegador. O intente agregar algo de código en doPost método de su servlet, puede enviar una solicitud posterior. - user1335794

Hice algunos cambios para que coincidieran con lo que habría funcionado en el navegador, pero aún nada. oh, sí

Dudo que el problema esté en OutputStream oOutStrm = res.getOutputStream();.

apuesto res is HttpServletResponse y devuelve un ServletOutputStream adecuado para escribir datos binarios en la respuesta. El contenedor de servlet no codifica los datos binarios

Consulta API

Por lo tanto, es posible que no obtenga nada excepto fileName.

En Servlet Probar

FileOutputStream stream = new FileOutputStream("c:/excel/Book1.xls");
workBook.write(stream);

contestado el 03 de mayo de 12 a las 13:05

Desafortunadamente, no puedo hacer cambios en el servlet, debido a ciertas razones :( - oh, sí

Verifique la respuesta editada. Tienes que escribir algo para OutputStream de lo contrario, no obtendrá nada como salida. - Hardik Mishra

No entiendo lo que quieres decir. Ahora mismo wbBook.write(oOutStrm); funciona, el tipo de contenido se establece en application/ms-excel. El código del servlet lo heredan muchas clases secundarias, por lo que es muy difícil para mí justificar cambiar el código allí. - oh, sí

¿Cómo se puede llegar a saber que se ha heredado otro código? He respondido en base a tu publicación y no habías mencionado lo mismo también. De todos modos espero que tu problema se resuelva - Hardik Mishra

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.