[ Resolvido] FileUpload com InputStream

Boa Noite a todos.

Estou utilizando VRaptor 3.

Tenho um controlador com uma action que recebe o upload de fotos.

Eu preciso gerar duas fotos ( dois arquivos ).

Um deles é a imagem original.
O outro é uma thumbnail.

O problema é que quando eu faço a primeira cópia para o disco, parece que o stream recebido da foto fica nulo, ou da a entender que “esteja em uso” pela outra função.

A pergunta é a seguinte: Como fazer o stream ser “duplicado” ou ser utilizado pelas duas funções?

Segue um trecho do código.

public void cadastrar(Imagem imagem, UploadedFile foto) {
// Aqui é o stream da foto
         InputStream stream = foto.getFile();

 // Criação de Diretórios...

 // Criação dos arquivos
                // Cria a foto
               arquivo = new File(diretorio+tmpName+".jpg");
               arquivo.createNewFile();

                // Cria a thumbnail
                thumbnail = new File(diretorio+"thumb_"+tmpName+".jpg");
                thumbnail.createNewFile();

                // Primeiro redimensiona a thumbnail ( Funciona sempre a primeira manipulação do stream, não importa se inverter essas linhas )
                Utilitarios.gerarThumbnail(stream, new FileOutputStream(thumbnail), Configuracao.ALTURA_THUMB_ALBUM, 9);
                
                // Agora copia a foto original para o disco ( Aqui já não funciona, mas se eu coloca-lo primeiro que o redimensionamento ele funciona )
                IOUtils.copy(stream, new FileOutputStream(arquivo));

// Continuação do código...
}

Enfim, está ai a duvida. Espero que possa me auxiliar e servir de exemplo para outras pessoas.

Abraço a todos, fiquem com Deus.

Olá,

quando você usa um stream e o fecha, não dá pra usar de novo, em geral…

você pode fazer o seguinte:

  • primeiro copia a original para o arquivo.
InputStream stream = foto.getFile();

 // Criação de Diretórios...

 // Criação dos arquivos
                // Cria a foto
               arquivo = new File(diretorio+tmpName+".jpg");
               arquivo.createNewFile();
              IOUtils.copy(stream, new FileOutputStream(arquivo));

depois cria o thumbnail a partir desse arquivo (criando um FileInputStream)

 // Cria a thumbnail
                thumbnail = new File(diretorio+"thumb_"+tmpName+".jpg");
                thumbnail.createNewFile();

                // Primeiro redimensiona a thumbnail ( Funciona sempre a primeira manipulação do stream, não importa se inverter essas linhas )
                Utilitarios.gerarThumbnail(new FileInputStream(arquivo), new FileOutputStream(thumbnail), Configuracao.ALTURA_THUMB_ALBUM, 9);

isso deve funcionar

[]'s

Muito bom!

Agradeço a ajuda Lucas… Sempre ae pra responder às perguntas hehe…

Abraço, fica com Deus.