abrir/guardar archivo en smartGWT

He implementado RPCService, RPCServiceAsync & RPCServieImpl. Al hacer clic en un botón de un servicio en el lado del servidor se llama y va a obtener los datos de la DB y se crea el archivo. Una vez creado el archivo, entonces la necesidad de abrir el archivo en el lado del cliente y la necesidad de pedir a un cuadro de diálogo de abrir/guardar opciones.
¿cómo puedo aplicar esto en la apertura de un archivo de pieza. pls sugieren una forma de implementar t.. Respuesta pls.. gracias de antemano….

@Hambend : todavía tengo uno más que se aclare !.. cómo se llama a este método doGet en otro servlet es decir, en mi onmodule clase de carga estoy teniendo montón de widgets en separar diseño y un ejemplo de un widget de BOTÓN ? onclicking este botón servicio RPCServiceImpl se llama y todas las manipulaciones se realizan y se crea el archivo en un serperate de la función pública (int GenerateFile(String nombre)() ) . cómo hacer que la función de llamada de método doGet ? desde doGet necesidades de la petición,la respuesta de los parámetros que se pasan junto con ella?? pls me sugieren un método para llamar a ese método. gracias de antemano

  • ¿Usted necesita para guardarlo en el lado del cliente, o se puede guardar en el lado del servidor ? El problema con el lado del cliente es conseguir que el navegador del sandbox que permite manipular el sistema de archivos local.
InformationsquelleAutor Karthikeyan | 2010-06-16

2 Kommentare

  1. 5

    GWT los servicios RPC sólo son capaces de enviar objetos java de vuelta al cliente. Para enviar un archivo para que el usuario deberá utilizar un no-GWT java servlet. Aquí está el código que he usado antes para servir 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» debe causar la mayoría de los navegadores para descargar el archivo en lugar de mostrar, con el nombre de archivo por defecto todo lo que proporcionan. La forma de utilizar este servlet es para que el usuario llame a la RPCService que ya tiene, que guarda el archivo a la carpeta del repositorio. A continuación, enlace o dirigirlos a este servlet con una url como http://your.domain.com/fileServlet?file=myFile.jpg. Obviamente, con esta configuración tiene un riesgo de seguridad donde los usuarios pueden descargar de la gente de otros archivos si pueden adivinar los nombres de archivo.

    Lo que te gustaría hacer es combinar el código de base de datos de su servicio RPC en este servlet. No hay necesidad de guardar el archivo en cualquier lugar en el servidor, usted puede tomar su base de datos de resultados y escribirlos en la respuesta.getOutputStream() o respuesta.getWriter() exactamente de la misma manera habría que escribir a archivo, excepto que el resultado va directamente al usuario. Como establece su contenido encabezados correctamente el usuario no notará la diferencia.

    Usted no puede llamar a este método desde otro servlet, la única manera de hacer un navegador para descargarlo como un archivo para acceder a ella a través de una normal de solicitud HTTP. Primero se declara el servlet en su web.xml archivo de como se haría con GWT servicio 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 cualquiera de las solicitudes HTTP GET va a http://your.tomcat.server/webapp/imageServlet obtendrá recogido por ImageServlet.doGet(). A continuación, en el lado del cliente puede hacer un html normal el enlace al archivo:

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

    …o, usted debe ser capaz de poner esto en una ClickHandler (yo no lo he probado):

    Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);
    • muchas gracias hambend.. todavía me hav uno más que se aclare ! pls claro.. cómo se llama a este método doGet en otro servlet ? en mi onmodule clase de carga estoy teniendo montón de widgets en separar diseño y un ejemplo de un widget de BOTÓN ? cómo accionar que onclick elemento de botón para llamar a este método ??
    • He editado mi respuesta para aclarar cómo utilizar el servlet.
    • muchas gracias…. Yo tengo trabajo…. Gracias ..
    • yo implementado con un pequeño cambio.. mediante la implementación de un marco oculto y me carga que servlet de la estructura. Muchas gracias por ur ayuda..
  2. 0

    Si el archivo es de texto, entonces usted siempre atrás de un Objeto con una matriz de Cadenas.

    Si binario simplemente un byte[] en la clase que iba a hacer.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea