Pergunta

Eu tenho implementado RPCService, RPCServiceAsync & RPCServieImpl.Ao clicar em um botão de um serviço no lado do servidor será chamado e vai buscar dados do banco de dados e o arquivo é criado.Uma vez que o arquivo é criado, então, eu preciso abrir o arquivo no lado do cliente e precisa de um prompt de caixa de diálogo com opções para abrir/gravar.como posso implementar esta abrindo um arquivo a parte.pls sugerir um caminho para implementar t..Resposta pls..obrigado antecipadamente....

@Hambend :Eu ainda tenho mais um esclarecimento !..como chamar este método doGet em outro servlet i.e.na minha onmodule classe de carga que eu estou tendo monte de widgets em separado layout e uma tal um widget de BOTÃO ?onclicking este botão serviço RPCServiceImpl é chamado e todas as manipulações são feitas e o arquivo é criado em um serperate função (int pública GenerateFile(String nome)() ) .como fazer com que a função para chamar o método doGet ?desde doGet necessidades pedido,os parâmetros de resposta a ser passado junto com ele??pls me sugerir um método para chamar o método.obrigado antecipadamente

Foi útil?

Solução

GWT RPC serviços só são capazes de enviar objetos java de volta para o cliente.Para enviar um arquivo para o usuário, você precisará usar um não-GWT java servlet.Aqui está o código que eu usei antes de servir imagens jpeg a partir de um repositório.

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:anexo" deve fazer com que a maioria dos navegadores para baixar o arquivo em vez de exibi-lo, com o nome de arquivo padrão para o que quer que você fornecer.A maneira como você iria usar este servlet é que o usuário chamar o RPCService que você já tem, o que salva o arquivo para a pasta do repositório.Em seguida, vincular ou redirecioná-los para este servlet com uma url como http://your.domain.com/fileServlet?file=myFile.jpg.Obviamente, com esta configuração você tem um risco de segurança, onde os usuários podem fazer download de outras pessoas arquivos se eles podem adivinhar os nomes de arquivos.

O que você gostaria de fazer é mesclar o código de banco de dados a partir de seu serviço RPC para este servlet.Não é necessário salvar o arquivo em qualquer lugar no servidor, você pode ter seus resultados de banco de dados e gravá-los em resposta.getOutputStream (), ou a resposta.getWriter() exatamente da mesma maneira que você iria gravá-los em arquivo, exceto que o resultado vai direto para o usuário.Contanto que você definir o seu conteúdo cabeçalhos corretamente o usuário não notará a diferença.

Você não pode chamar esse método a partir de outro servlet, a única maneira de fazer um navegador para fazer o download como um arquivo é acessá-lo através de uma normal solicitação HTTP.Primeiro você declara o servlet no seu web.xml arquivo como se fosse um GWT RPC serviço:

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

Agora, qualquer solicitações HTTP GET vai http://your.tomcat.server/webapp/imageServlet será apanhado por ImageServlet.doGet().Em seguida, no lado do cliente, você pode fazer um html normal link para o arquivo:

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

...ou, deve ser capaz de colocar isso em um ClickHandler (eu não testei):

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

Outras dicas

Se o ficheiro de texto e, em seguida, você sempre volta um Objeto com uma matriz de Seqüências de caracteres.
Se o binário, então, simplesmente de um byte [], na classe de faria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top