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?
Passando inputStream via WebService
7 Respostas
: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. 
Então se o client passar o File e no webService eu pegar o stream do file recebido funciona?
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%).
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?
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.
thingol e depois como que eu faço para montar o InputStream através deste array de bytes…?
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[]