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. :?:
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();
}
}
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.
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.