Vraptor - Upload

Estou usando:

vraptor-3.2.0
commons-fileupload-1.2.2

Continua dando o mesmo problema! :frowning:

atualiza pro vraptor 3.3.1

Tentei atualizar, mas estou tendo erros estranhos na hora de subir. Uns erros loucos com scannotation :frowning:
Ainda não tive tempo de parar pra resolver.

esse problema do scannotation já foi resolvido… se vc quiser usar a versão snapshot que resolveu:
https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.4.0-SNAPSHOT/vraptor-3.4.0-20110704.175134-7.jar

Tem previsao para saida da versão estável? Vou implementando outras coisas e quando sair a estavel volto nessa atualizacao, quero atualizar tambem a versao do jboss…

breve :wink:

Consegui corrigir o problema atualizando para a versao 6.1.0 Final do Jboss! :slight_smile:
Obrigado a todos!

Lucas, me tira uma dúvida e pra salvar em banco de dados ? Oque mudo no código já que não irei salvar em nenhuma pasta.


public void atualizaTermo(Termo termo, UploadedFile fileInfo) throws FileNotFoundException, IOException {

        if (fileInfo == null) {
            System.out.println("\n\n\nErro upload, não foi selecionado o arquivo para UPLOAD\n\n");
        } else {
            File destino = new File("C:/Documents and Settings/Meus documentos/NetBeansProjects/SisSTM/web/downloads/" + fileInfo.getFileName());
            destino.createNewFile();
            InputStream stream = fileInfo.getFile();
            IOUtils.copy(stream, new FileOutputStream(destino));
            System.out.println("\n\n\nUpload feito com sucesso\n\n\n");
        }
        result.redirectTo(this).lista();//Após o upload, redireciona para a lista
    }

Att Gordon

ao invés de copiar o stream pra um arquivo, copie-o para um ByteArrayOutputStream e salve esse byte[] no banco (pode ser num atributo da sua entidade anotado com @Lob)…

se eu não me engano o IOUtils já tem um método que transforma o InputStream em byte[]. Se não tiver tenta usar o ByteStreams do google guava.

Obrigado, funcionando posto a solução.
Tks
Att Gordon

Lucas, segue abaixo a mudança. Não sei se entendi, mas não salva no BD e nem dá erro… ou seja… pra onde foi o arquivo rsrsrrsrs

Segue a mudança da maneira como entendi:

public void atualizaTermo(Termo termo, UploadedFile fileInfo) throws FileNotFoundException, IOException {

        if (fileInfo == null) {
            System.out.println("\n\n\nErro upload, não foi selecionado o arquivo para UPLOAD\n\n");
        } else {            
            InputStream stream = fileInfo.getFile();
            IOUtils.copy(stream, new ByteArrayOutputStream());
            System.out.println("\n\n\nUpload feito com sucesso\n\n\n");
        }
        result.redirectTo(this).lista();//Após o upload, redireciona para a lista
       
       
   }

Att Gordon

guarda o BAOS em uma variável, e depois salva o baos.getBytes() no banco… vc precisa colocar um atributo byte[] no termo

Lucas, ainda não rolou, estou errando e não acho .

Modelo
--------[code]
//omitido outros metodos
@Lob @Basic(fetch= FetchType.EAGER)
@Column(name = “file”)
private byte[] file;

//gets sets
//omitido os gets/sets
[/code]

Dao
-------- //omitido outros metodos public void atualiza(byte[] buffer) { Transaction tx = session.beginTransaction(); session.save(buffer); tx.commit(); }

Controller
-------[code]

public void atualizaTermo(Termo termo, UploadedFile fileInfo) throws FileNotFoundException, IOException {

    if (fileInfo == null) {
        System.out.println("\n\n\nErro upload, não foi selecionado o arquivo para UPLOAD\n\n");
    } else {
        byte[] buffer;
        InputStream stream = fileInfo.getFile();
        IOUtils.copy(stream, new ByteArrayOutputStream());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();            
        buffer = baos.toByteArray();                        
        dao.atualiza(buffer);
        
        System.out.println("\n\n\nUpload feito com sucesso\n\n\n");
    }
    result.redirectTo(this).lista();//Após o upload, redireciona para a lista

[/code]

Dei uma lida sobre BAOS, mas não entendi como usa-lo junto ao hibernate e vraptor.

Att Gordon

vc está copiando pro output errado:


            ByteArrayOutputStream baos = new ByteArrayOutputStream();              

            IOUtils.copy(stream, baos);  
            buffer = baos.toByteArray();                          
            dao.atualiza(buffer);  

e no dao não é pra mandar salvar o buffer, é pra colocar o buffer na entidade e mandar salvar a entidade

Correto! Muito obrigado.
Att Gordon

Pessoal estou fazendo o upload mais esta vindo nulo quando

será que alguem pode me ajudar?

Qual versão do vraptor você está usando? Tive esse problema usando a 3.2.1. Pois o interceptador que deveria pegar o request estava sem a anotação e simplesmente não rodava. Caso você possa atualize a sua versão do vraptor. Caso não possa faça como eu:

Simplesmente extendi a classe CommonsUploadMultipartInterceptor (o interceptador que deveria ter as anotações @Intercepts e @RequestScoped), adicionando as anotações corretamente, assim o vraptor chama a minha instancia para tratar o upload, e minha instancia chama o proprio vraptor… só isso:

@Intercepts
@RequestScoped
public class FileUploadInterceptor extends CommonsUploadMultipartInterceptor {

    public FileUploadInterceptor(HttpServletRequest request, MutableRequest parameters, MultipartConfig config, Validator validator) {
        super(request, parameters, config, validator);
    }

    @Override
    public boolean accepts(ResourceMethod method) {
        return super.accepts(method);
    }

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
        super.intercept(stack, method, resourceInstance);
    }
}

estou usando a 3.3.1 eu tenho que importar o commons-fileupload para funcionar?

sim

Agora funcionou obrigado pessoal