Pregunta

Me han implementado RPCService, RPCServiceAsync y RPCServieImpl. Al hacer clic en un botón de un servicio en el lado del servidor se llamará y será obtener los datos de la base de datos y se crea el archivo. Una vez creado el archivo, entonces necesito para abrir ese archivo en el lado del cliente y necesidad de un diálogo de consulta con el / abrir las opciones de guardado.    ¿Cómo puedo poner en práctica esta abertura una parte del archivo. pls sugieren una forma de implementar t .. Responder pls .. gracias de antemano ....

@Hambend: Todavía tengo una aclaración más .. cómo llamar a este método doGet en otro servlet es decir, en mi clase de carga onmodule estoy teniendo muchos de los widgets en la disposición separada y uno de esos es un widget de botón!? onclicking este servicio RPCServiceImpl botón se llama y todas las manipulaciones se realizan y el archivo se crea en función serperate (public int GenerateFile (String name) ()). cómo hacer que la función de llamar al método doGet? desde doGet necesita solicitud, los parámetros de respuesta que se pasan junto con él ?? pls me sugieren un método para llamar a ese método. gracias de antemano

¿Fue útil?

Solución

servicios RPC de GWT sólo son capaces de enviar objetos Java de vuelta al cliente. Para enviar una copia de archivo para el usuario tendrá que utilizar un servlet de Java no GWT. Aquí hay un código que he usado antes para servir a las imágenes JPEG desde un repositorio.

public class ImageServlet extends HttpServlet {
    private final String repository = "/var/images/";

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String filename = request.getParameter("file");

        // Security: '..' in the filename will let sneaky users access files
        // not in your repository.
        filename = filename.replace("..", "");

        File file = new File(repository + filename);
        if (!file.exists())
            throw new FileNotFoundException(file.getAbsolutePath());

        response.setHeader("Content-Type", "image/jpeg");
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-disposition", "attachment;filename=\"" + filename + "\"");

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buf = new byte[1024];
        while (true) {
            int length = bis.read(buf);
            if (length == -1)
                break;

            bos.write(buf, 0, length);
        }
        bos.flush();
        bos.close();
        bis.close();
    }
}

"Content-Disposition: attachment" debería hacer que la mayoría de los navegadores para descargar el archivo en lugar de mostrar que, con el nombre de archivo por defecto a lo que usted proporciona. La manera que utilizaría este servlet es tener la llamada de usuario del RPCService que ya tiene, que guarda el archivo en la carpeta del depósito. A continuación, vincular o los redirija a este servlet con un enlace como http: // tu. domain.com/fileServlet?file=myFile.jpg . Obviamente, con esta configuración tiene un riesgo de seguridad, donde los usuarios pueden descargar archivos de otras personas si pueden adivinar los nombres de archivo.

¿Qué le gustaría hacer es fusionar el código de la base de datos de su servicio RPC en este servlet. No hay necesidad de guardar el archivo en cualquier lugar en el servidor, puede tomar los resultados de base de datos y escribirlos en response.getOutputStream () o response.getWriter () exactamente de la misma manera que escribirlos en el archivo, excepto que el resultado va directamente al usuario. Mientras configura las cabeceras de contenido correctamente el usuario no notará la diferencia.

No se puede llamar a este método desde otro servlet, la única manera de hacer que un navegador para descargar como archivo es para acceder a ella a través de una petición HTTP normal. En primer lugar se declara el servlet en el archivo web.xml como lo haría un servicio GWT RPC:

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>
        com.package.ImageServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/imageServlet</url-pattern>
</servlet-mapping>

Ahora, cualquier peticiones HTTP GET va a http: //your.tomcat.server/webapp/imageServlet por ImageServlet.doGet (). A continuación, en el lado del cliente o bien puede hacer un enlace HTML normal al archivo:

new HTML("<a href='" + GWT.getHostPageBaseURL() + "imageServlet?file=" + filename + "'>download</a>");

... o, que debe ser capaz de poner esto en un clickHandler (no he probado):

Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);

Otros consejos

Si el archivo es de texto, entonces siempre volver hacia atrás un objeto con una matriz de cadenas.
Si binaria entonces simplemente un byte [] en la clase haría.

scroll top