Passando inputStream via WebService

7 respostas
Licuri

Galera eu consigo fazer isso, passar um input stream para um webservice, ou é melhor eu passar o File e no WebService eu pego o stream?

7 Respostas

C

:shock: Wow! Como diz na página do axis, você não pode enviar objetos java arbitrários por um fio e esperar que eles sejam entendidos do outro lado :?
Só dá pra passar classes que implementam Serializable. Bom, File implementa, mas não deve servir pra muita coisa do lado do outro lado, já que é apenas uma espécie de apontador para o arquivo. :wink:

Licuri

Então se o client passar o File e no webService eu pegar o stream do file recebido funciona?

T

Não é para funcionar.
O correto seria pegar o conteúdo do inputstream, lê-lo completamente, e enviá-lo como um array de byte. (Isso pode ser feito da seguinte maneira:

byte[] leInputStream (InputStream is ) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buf = new byte[8192];
    int nBytes;
    while ((nBytes = is.read (buf)) > 0) {
        baos.write (buf, 0, nBytes);
    }
    is.close();
    baos.close();
    return baos.toByteArray();
}

Esse array é serializado pelo suporte a Web Services normalmente em Base-64 (ou seja, de forma razoavelmente eficiente - aumento de um pouco mais de 30%).

Z

thingol:
Não é para funcionar.
O correto seria pegar o conteúdo do inputstream, lê-lo completamente, e enviá-lo como um array de byte. (Isso pode ser feito da seguinte maneira:

byte[] leInputStream (InputStream is ) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buf = new byte[8192];
    int nBytes;
    while ((nBytes = is.read (buf)) > 0) {
        baos.write (buf, 0, nBytes);
    }
    is.close();
    baos.close();
    return baos.toByteArray();
}

Esse array é serializado pelo suporte a Web Services normalmente em Base-64 (ou seja, de forma razoavelmente eficiente - aumento de um pouco mais de 30%).

thingol por favor pode me explicar esta linha

byte[] buf = new byte[8192]; para que server este numero?

T

Isso é um buffer que usei para copiar os dados de um lado para o outro. Porque usei 8192 ? É um número mágico (8 KBytes = 8 * 1024 - verifiquei experimentalmente que é um valor adequado para melhor desempenho em muitas aplicações), mas poderia ter usado outro valor.

Licuri

thingol e depois como que eu faço para montar o InputStream através deste array de bytes…?

T

Você pode pegar o array de bytes que foi enviado via Web Services para o seu web service e convertê-lo em um ByteArrayInputStream.

ByteArrayInputStream bais = new ByteArrayInputStream (bytes);

onde “bytes” é um byte[]

Criado 5 de maio de 2006
Ultima resposta 8 de mai. de 2006
Respostas 7
Participantes 4