Domanda

Ho implementato RPCService, RPCServiceAsync & RPCServieImpl. Su clic su un pulsante di un servizio nel lato server sarà chiamato e sarà recuperare i dati da DB e viene creato un file. Una volta creato il file, quindi ho bisogno di aprire il file nel lato client e necessità di pronta una finestra di dialogo con / aperto opzioni di salvataggio.    Come posso implementare questa apertura di una parte del file. pls suggerire un modo per implementare t .. Rispondi pls .. grazie in anticipo ....

@Hambend: ho ancora un altro chiarimento .. come chiamare questo metodo doGet in un altro servlet vale a dire nella mia classe di carico onmodule sto avendo molti widget nel layout separato e uno di questi è un widget BUTTON!? onclicking questo servizio RPCServiceImpl pulsante viene chiamato e tutte le manipolazioni sono fatto e file viene creato in una funzione serperate (public int GenerateFile (String name) ()). come fare quella funzione di chiamare il metodo doGet? poiché doGet necessita richiesta, i parametri di risposta da passare con esso ?? pls mi suggeriscono un metodo da chiamare quel metodo. grazie in anticipo

È stato utile?

Soluzione

servizi RPC del GWT sono solo in grado di inviare oggetti Java al client. Per inviare un file indietro per l'utente è necessario utilizzare un servlet Java non GWT. Ecco un po 'di codice che ho usato prima per servire fino jpeg le immagini da un repository.

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" dovrebbe causare maggior parte dei browser per scaricare il file invece di visualizzarlo, con il nome del file inadempiente a tutto ciò che fornisci. Il modo in cui si può usare questa servlet è quello di avere l'utente chiamata RPCService che già avete, che salva il file nella cartella di repository. Poi, si collega o reindirizzare a questo servlet con un URL come http: // tuo. domain.com/fileServlet?file=myFile.jpg . Ovviamente con questa configurazione si ha un rischio per la sicurezza dove gli utenti possono scaricare i file di altre persone se possono indovinare i nomi dei file.

Che cosa si potrebbe fare è unire il codice database dal servizio RPC in questo servlet. Non c'è alcuna necessità di salvare il file ovunque sul server, è possibile prendere i vostri risultati del database e scriverle in response.getOutputStream () o response.getWriter () esattamente nello stesso modo in cui li avrebbe scritto al file, eccetto che il risultato va dritto per l'utente. Finché si impostano le intestazioni di contenuto in modo corretto l'utente non noterà la differenza.

Non è possibile chiamare questo metodo da un altro servlet, l'unico modo per fare un browser per scaricare come file è di accedervi attraverso una richiesta HTTP normale. In primo luogo si dichiara la servlet nel file web.xml come se fosse un servizio di 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>

Ora, qualsiasi richieste HTTP GET andando a http: //your.tomcat.server/webapp/imageServlet otterrà raccolto da ImageServlet.doGet (). Poi sul lato client è possibile fare un normale link HTML al file:

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

... oppure, è dovrebbe essere in grado di mettere questo in un clickHandler (non ho provato):

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

Altri suggerimenti

Se il file è di testo, allora si torna sempre indietro di un oggetto con una serie di stringhe.
Se binario allora semplicemente un byte [] nella classe avrebbe fatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top