Frage

Ich habe RPCService, RPCServiceAsync & RPCServieImpl umgesetzt. Beim Klicken wird eine Schaltfläche ein Dienst in Server-Seite aufgerufen und es wird die Daten aus DB holen und Datei erstellt wird. Sobald die Datei erstellt wird, dann muß ich diese Datei in Client-Seite öffnen und Notwendigkeit, prompt ein Dialogfeld mit Öffnen / Speichern-Optionen.    Wie kann ich diese Datei öffnen Teil implementieren. pls deutet auf eine Art und Weise t zu implementieren .. Antwort pls .. Vielen Dank im Voraus ....

@Hambend: Ich habe noch eine weitere Klärung .. wie diese doGet-Methode aufrufen, in einem anderen Servlet das heißt in meinem onmodule Belastungsklasse i viele Widgets in eigener Layout und ein solches Widget BUTTON ist habe!? onclicking diese Taste Service RPCServiceImpl aufgerufen und alle Manipulationen sind fertig und Datei wird in einer Funktion separate Innen (public int GenerateFile (String name) ()) erstellt. wie man diese Funktion machen doGet-Methode aufrufen? da doGet Anfrage benötigt, Antwortparameter mit ihm entlang geführt werden ?? pls schlagen mir eine Methode, die Methode aufzurufen. Vielen Dank im Voraus

War es hilfreich?

Lösung

GWT RPC-Dienste sind nur in der Lage Java senden an den Client-Objekte zurück. Um eine Datei zurück an den Benutzer zu senden werden Sie brauchen eine nicht-GWT Java-Servlet zu verwenden. Hier einige Code, den ich verwendet habe, bevor serviert JPEG-Bilder aus einem 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“ sollte die meisten Browser verursachen die Datei statt der Anzeige, um sie herunterzuladen, mit dem Dateinamen säumigen, was auch immer Sie zur Verfügung stellen. Die Art und Weise Sie das Servlet verwenden würde, ist der Benutzer Aufruf haben die RPCService, dass Sie bereits haben, die die Datei in das Repository-Ordner gespeichert werden. Dann verknüpfen Sie oder leiten Sie sie auf diese Servlet mit einer URL wie http: // Ihr. domain.com/fileServlet?file=myFile.jpg . Offensichtlich mit diesem Setup haben Sie ein Sicherheitsrisiko dar, wo Benutzer können andere Personen die Dateien herunterladen, wenn sie die Dateinamen erraten kann.

Was Du zu tun ist, um den Datenbank-Code von Ihrem RPC-Dienst in dieses Servlet fusionieren. Es gibt keine Notwendigkeit, die Datei irgendwo auf dem Server zu speichern, können Sie Ihre Datenbank Ergebnisse nehmen und schreiben sie in response.getOutputStream () oder response.getWriter () in genau der gleichen Weise würden Sie sie auf Datei schreiben, mit der Ausnahme, dass das Ergebnis geht gerade an den Benutzer. Solange Sie Ihren Content-Header richtig der Benutzer eingestellt werden den Unterschied nicht bemerken.

Sie können diese Methode nicht Anruf von einem anderen Servlet, die einzige Möglichkeit, einen Browser zu machen es zum Download als eine Datei, um sie durch eine normale HTTP-Anforderung für den Zugriff ist. Zuerst erklären Sie das Servlet in web.xml Datei wie einen GWT RPC-Dienst:

<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>

Nun kann jeder HTTP-GET-Anfragen gehen an http: //your.tomcat.server/webapp/imageServlet wird von ImageServlet.doGet () abgeholt werden. Dann auf der Client-Seite können Sie entweder einen normalen HTML-Link auf die Datei machen:

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

... oder Sie sollte der Lage sein, dies zu setzen in einem clickhandler (ich habe es nicht getestet):

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

Andere Tipps

Wenn die Datei Text, dann immer Sie ein Objekt mit einem Array von Strings zurück.
Wenn binäre dann einfach ein byte [] in der Klasse tun würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top