Gravação do anexo de um e-mail em um BLOB no Oracle

Utilizando Javamail:
Gostaria de conseguir algum exemplo de como gravar diretamente o conteúdo de um anexo de um email (BodyPart), ex.: um JPG, para um BLOB no Oracle, sem a criação de um arquivo intermediário ???

Tentei atualizar o comando SQL do PrepareStatement com o método setBinaryStream(), com o seguinte trecho:
PreparedStatement ps = conn.prepareStatement(sql);
InputStream in = part.getDataHandler().getInputStream();
ps.setBinaryStream(1,in,in.available()); // 1 eh meu unico (?) no comando SQL referente ao campo BLOB.

O problema está sempre relacionado com o último parâmetro (tam bytes) do setBinaryStream, pois os método available() ou getSize() da mensagem não retornam os valores corretos. :?:

Obrigado pela atenção.

available() não dá o total do conteúdo de um fluxo, não, dá o disponível no buffer em algum instante.
Quanto ao getSize(), se for o da Part e não o da mensagem, deveria funcionar.

Lembre-se que um anexo vem codificado, geralmente em Base64 ou QuotedPrintable. Para usar esses dados, tem que passar de Codec apropriado.

Estou tentando utilizar o método getSize() e ele aparentemente está me retornando a quantidade certa de Bytes que formam o JPG, comprando com o tamanho em Kbytes da imagem. Veja o código abaixo, estou obtendo a seguinte mensagem durante a execução: JAVA.SQL.EXCEPTION: Nao serao lidos mais dados do soquete.
O que poderia ser isto ?

(((( Estou recebendo a mensagem aqui através de uma função com parametro Message msg))))

Multipart mp = (Multipart)msg.getContent();
int contaArq = 0;
for (int k=0; k < mp.getCount(); k++){
Part conteudo = mp.getBodyPart(k);
String disp = conteudo.getDisposition();
if (disp!=null) {
String nomeArquivo = conteudo.getFileName(); // Nome do arquivo
sql = “insert into CAD_EMAIL_ARQ_SISTEMA values " +
”(’" + cpu + “’,” + seqOper + “,” + (++contaArq) + “,’” +
nomeArquivo + “’,?)”;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setBinaryStream(1,conteudo.getInputStream(),conteudo.getSize());
ps.executeUpdate();
}
}

Obrigado pela atenção.

Editei o seu código, mas não testei.

Por favor, cheque tudo e tente executar. O que eu fiz, foi o seguinte: decodifiquei de acordo com o tipo na esperança de ele retornar o tamanho correto do anexo.

import javax.mail.internet.MimeUtility;

...
  sql = &quot;insert into CAD_EMAIL_ARQ_SISTEMA values &#40;?,?,?,?&#41;&quot;;
  PreparedStatement ps = conn.prepareStatement&#40;sql&#41;;
  ps.setString&#40;1, cpu&#41;;
  ps.setInt&#40;2, seqOper&#41;;
  //
  Multipart mp = &#40;Multipart&#41;msg.getContent&#40;&#41;;
  int contaArq = 0;
  for &#40;int k=0; k &lt; mp.getCount&#40;&#41;; k++&#41;
  &#123;
    Part conteudo = mp.getBodyPart&#40;k&#41;;
    String disp = conteudo.getDisposition&#40;&#41;;
    if&#40;disp == null || disp.equals&#40;Part.ATTACHMENT&#41;&#41;
    &#123;
      String encoding = conteudo.getHeader&#40;&quot;Content-Transfer-Encoding&quot;&#41;;
      ps.setInt&#40;3, ++contaArq&#41;;
      ps.setString&#40;4, conteudo.getFileName&#40;&#41;&#41;&quot;;
      ps.setBinaryStream&#40;5, MimeUtility.decode&#40;conteudo.getInputStream&#40;&#41;, encoding&#41;, conteudo.getSize&#40;&#41;&#41;;
      ps.executeUpdate&#40;&#41;;
    &#125;
    ... 

Fiz as alterações, porém o método getHeader() retorna um array de Strings : String encoding[] = conteudo.getHeader(“Content-Transfer-Encoding”);

Então tentei utilizar a primeira posição do array : ps.setBinaryStream(5, MimeUtility.decode(conteudo.getInputStream(), encoding[0]),conteudo.getSize()); — O conteúdo desta primeira posicao é : base64.

Concluindo: Não apresentou erro na gravação do anexo porém tentei carregar este conteúdo blob em mais de uma ferramenta e elas me retornam que o formato da imagem (dados) é inválido.

Vou tentar criar um arquivo temporário e transferir para o BLOB o conteúdo deste arquivo.

Obrigado por enquanto.