O parâmetro sempre chega com null. Estou usando o tomcat 7
public void upload(UploadedFile imagem) {
if (imagem != null) {
try {
File root = new File(contexto.getRealPath("/"));
File dir = new File(root.getCanonicalPath() + File.separator + "imagens/");
IOUtils.copy(imagem.getFile(), new FileOutputStream(new File(dir.getName(), imagem.getFileName())));
result.forwardTo(this).exibe();
} catch (IOException ex) {
LOG.error("Erro efetuando o upload do arquivo. " + ex.getMessage());
result.forwardTo(ErroController.class).form("Erro efetuando o upload do arquivo. " + ex.getMessage());
}
} else {
LOG.error("Arquivo em branco ou nulo." );
result.forwardTo(ErroController.class).form("Arquivo em branco ou nulo.");
}
}
<form action="<c:url value="/upload/enviar" />" enctype="multipart/form-data" method="post">
<input type="file" name="imagem"/><br/>
<input type="submit" value="Enviar" />
</form>
tenta colocar o commons-fileupload no classpath.
Já esta. Já tinha visto isso em outros posts. Será que o problema é com o tomcat 7?
tenta habilitar os logs do vraptor e ver se aparece alguma informação
A única mensagem no LOG padrão é essa: Request contains multipart data. Try to parse with Servlet3 Part.
Vou tentar alterar o nível de log.
O log esta com essa informação:
14:03:57,265 DEBUG [LazyInterceptorHandler.execute] () Invoking interceptor ParametersInstantiatorInterceptor
14:03:57,273 DEBUG [ParanamerNameProvider.parameterNamesFor] () Found parameter names with paranamer for EmailUploadController.upload(UploadedFile) as [imagem]
14:03:57,289 DEBUG [ParametersInstantiatorInterceptor.intercept] () Parameter values for [DefaultResourceMethod: EmailUploadController.uploadEmailUploadController.upload(UploadedFile)] are [null]
14:03:57,290 DEBUG [DefaultListableBeanFactory.createBean] () Creating instance of bean 'executeMethodInterceptor’
14:03:57,293 DEBUG [DefaultListableBeanFactory.createBean] () Finished creating instance of bean 'executeMethodInterceptor’
14:03:57,293 DEBUG [ToInstantiateInterceptorHandler.execute] () Invoking interceptor ExecuteMethodInterceptor
14:03:57,293 DEBUG [ExecuteMethodInterceptor.intercept] () Invoking EmailUploadController.upload(UploadedFile)
14:03:57,294 ERROR [EmailUploadController.upload] () Arquivo em branco ou nulo.
vc está com o vraptor mais novo? (o 3.4.1)
se sim, verifica se o commons-fileupload está em WEB-INF/lib, pq o vraptor tá usando o upload do servlet 3, que não funciona no tomcat 7 com filtros, e ele deveria estar usando o fileupload.
O problema era o true
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
<optional>true</optional>
</dependency>
Retirei o true e funcionou!!! MUITO OBRIGADO!!
Como o Lucas falou, isso é uma issue tanto do Tomcat 7 quanto do JBoss web. Isso porque a especificação do Servlet 3 não é clara se o Multipart support é apenas para Servlets ou para Filters também. Sendo assim a implementação inicial no Tomcat foi apenas para Servlets. Isso foi corrigido nas últimas versões do Tomcat, não lembro qual. Porém o JBoss web permanece sem suporte ao Multipart para Filters.
Em todos os outros appservers, como o Glassfish 3+ o suporte a Servlet Parts funciona perfeitamente.
O ideal nestas versões é usar o bom e velho (muito velho) commons-fileupload.