Webservices + arquivos binários

Gostaria de saber se é possível trafegar um arquivos ZIP atraves dos Webservices. O Arquivo normalmente será pequeno, gerando no máximo uns 50KB.
Alguém tem dica para fazer isso?

Atenciosamente,

Se o arquivo for pequeno (50K), ele cabe em uma String se você o codificar em Base-64, portanto pode ser enviado em uma String mesmo. Se for maior você precisa procurar algo sobre MTOM ou coisa parecida. Mas no seu caso em particular vá pelo mais fácil.

[quote=entanglement]Se o arquivo for pequeno (50K), ele cabe em uma String se você o codificar em Base-64, portanto pode ser enviado em uma String mesmo. Se for maior você precisa procurar algo sobre MTOM ou coisa parecida. Mas no seu caso em particular vá pelo mais fácil.
[/quote]

Tens algum exemplo de Base64 para trabalhar com arquivos?
Obrigado pela informação, acredito que consigo mandar muita informação com um ZIP (contendo um arquivo XML), um arquivo de 16Kb caiu para menos de 2KB. Portanto, acho que utilizando o base64 será suficiente.
Obrigado pela informação!

Se você tem um byte array (você leu o arquivo em um byte array), basta converter o byte array para uma String. Você pode usar a classe sun.misc.BASE64Encoder (não recomendado porque pode ser que não exista no JDK da IBM, por exemplo), ou então usar uma classe parecida que existe no pacote Commons Codec ( http://jakarta.apache.org ).

[quote=entanglement]Se você tem um byte array (você leu o arquivo em um byte array), basta converter o byte array para uma String. Você pode usar a classe sun.misc.BASE64Encoder (não recomendado porque pode ser que não exista no JDK da IBM, por exemplo), ou então usar uma classe parecida que existe no pacote Commons Codec ( http://jakarta.apache.org ).
[/quote]

Opa, melhor ainda saber que tem da Apache, a app cliente é um smartphone Android, então poderei fazer isso tranquilamento.
Valeu

Melhor ainda, parece que existe já uma classe android.os.Base64Utils ( http://www.androidjavadoc.com/1.0_r1_src/android/os/Base64Utils.html )

Ba, nem tinha ido atrás para saber do Android… Melhor ainda então!
Show de bola… vou realizar alguns testes aqui!
Valeu

Valeu mesmo cara…
Ficou show de bola… Gera um XML com dados que preciso, compacto para ZIP. Gero com o Base64, gravo outro XML com o Base64 do zip e o checksum do arquivo, meu cliente recebe o xml, gera o ZIP, verifica o checksum e boa… uhauhauhauha
Agora vou passar para o Android!
SHOWWW SHOWWWW!!!

Q legal cara, Base64 é show de bola mesmo.
Mas eu estou com um probleminha um pouco mais simples.
Estou tentando exibir as linhas de uma tabela do meu banco de dados, mas não estou conseguindo.
Eu consigo fazer o INSERT no banco de dados, mas o SELECT não consigo fazer.

Por favor se alguém puder me ajudar.

Estou utilizando:Windows 7, NetBeans 6.8, Framework SOAP JAXWS, Banco de Dados PostgreSQL 8.4;

Bom na minha aplicação estou tentanto fazer CRUD, contudo tenho: Class Produto (model) e a minha classe webservice (TesteCrudWs);

package org.ws;

import java.io.Serializable;

/**
 *
 * @author AndrePush
 */
public class Produto implements Serializable {

    private static final long serialVersionUID = 1L;
    private Integer codigo;
    private String descricao;
    private String marca;
    private int quantidade;
    private int valor;

    public Produto() {
    }

    public Produto(Integer codigo) {
        this.codigo = codigo;
    }

    public Produto(Integer codigo, String descricao, String marca, int quantidade, int valor) {
        this.codigo = codigo;
        this.descricao = descricao;
        this.marca = marca;
        this.quantidade = quantidade;
        this.valor = valor;
    }

    /**
     * @return the codigo
     */
    public int getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the descricao
     */
    public String getDescricao() {
        return descricao;
    }

    /**
     * @param descricao the descricao to set
     */
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    /**
     * @return the marca
     */
    public String getMarca() {
        return marca;
    }

    /**
     * @param marca the marca to set
     */
    public void setMarca(String marca) {
        this.marca = marca;
    }

    /**
     * @return the quantidade
     */
    public int getQuantidade() {
        return quantidade;
    }

    /**
     * @param quantidade the quantidade to set
     */
    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    /**
     * @return the valor
     */
    public int getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(int valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return "org.ws.TesteCrudWs[codigo= " + descricao + "]";
    }
}

Na view (SIB) do meu web service eu tenho a comunicação com o BD;


package org.ws;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.DriverManager;

import java.util.ArrayList;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import java.util.List;

/**
 *
 * @author AndrePush
 */
@WebService()
public class TesteCrudWs {

    private static final String URL_BASEDADOS =
            "jdbc:postgresql://localhost:5432/COMERCIO";
    private static final String USUARIO = "postgres";
    private static final String SENHA = "";
    private Connection con;
    private Statement stmt;
    private ResultSet rs;
    String sql;
    //Instancia do objeto produto
    Produto produto;

    @WebMethod(operationName = "compraProduto")
    public String compraProduto(@WebParam(name = "descricao") String descricao) {

        try {
            Class.forName("org.postgresql.Driver");
            con = DriverManager.getConnection(
                    URL_BASEDADOS, USUARIO, SENHA);

            stmt = con.createStatement();


            sql = ("SELECT descricao,marca,quantidade,valor FROM PRODUTO WHERE"
                    + " descricao " + produto.getDescricao());
            stmt.execute(sql);
            // Se existe o produto compra-lo
            while (rs.next()) {
                produto.setDescricao(rs.getString(1));
                produto.setMarca(rs.getString(2));
                produto.setQuantidade(rs.getInt(3));
                produto.setValor(rs.getInt(4));
            }
            rs = stmt.executeQuery(sql);
        } catch (Exception e) {
            e.getMessage();
        }
        try {

            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return compraProduto(compraProduto(descricao));

    }
    //Listar todos os objetos do banco de dados

    @WebMethod(operationName = "getListaProdutoGeral")
    public ArrayList<String> getListaProdutoGeral() {
        //TODO write your implementation code here:
        //  String dados="";
        try {
            Class.forName("org.postgresql.Driver");

            con = DriverManager.getConnection(URL_BASEDADOS, USUARIO, SENHA);

            stmt = con.createStatement();

            sql = ("SELECT *FROM PRODUTO");
            //Consultar http://www.guj.com.br/posts/list/113128.java
            rs = stmt.executeQuery(sql);

            while (rs.next()) {

                produto.setCodigo(rs.getInt("codigo"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setMarca(rs.getString("Marca"));
                produto.setQuantidade(rs.getInt("quantidade"));
                produto.setValor(rs.getInt("valor"));
            }
            
        } catch (Exception e) {
            e.getMessage();
        }
        return getListaProdutoGeral();

    }

    /**
     * Operação de serviço web
     */
    @WebMethod(operationName = "cadastrarProduto")
    public String cadastrarProduto(
            //PRODUTO
            @WebParam(name = "codigo") int codigo,
            @WebParam(name = "descricao") String descricao,
            @WebParam(name = "marca") String marca,
            @WebParam(name = "quantidade") int quantidade,
            @WebParam(name = "valor") int valor) {
        //TODO write your implementation code here:
        try {

            Class.forName("org.postgresql.Driver");
            con = DriverManager.getConnection(
                    URL_BASEDADOS, USUARIO, SENHA);

            stmt = con.createStatement();

            sql = ("INSERT INTO PRODUTO(codigo,descricao,marca,"
                    + "quantidade,valor)VALUES('" + codigo + "','" + descricao
                    + "','" + marca + "','" + quantidade + "','" + valor + "')");
            stmt.execute(sql);
            while (rs.next()) {
                //Produto
                produto.setCodigo(rs.getInt(1));
                produto.setDescricao(rs.getString(7));
                produto.setMarca(rs.getString(3));
                produto.setQuantidade(rs.getInt(4));
                produto.setValor(rs.getInt(5));
            }
            //rs = stmt.executeQuery(sql);
            stmt.executeUpdate(sql);
            con.commit();
            stmt.close();
        } catch (Exception e) {
            return e.getMessage();

        }
        return cadastrarProduto(codigo, descricao, marca, quantidade, valor);
    }

    /**
     * Operação de serviço web
     */
    @WebMethod(operationName = "listarProdCompra")
    public List<Produto> listarProdCompra() {
        //TODO write your implementation code here:

        return listarProdCompra();
    }
} 

Quero consertar o método getListaProdutoGeral;
Por favor gente me ajudem.