[RESOLVIDO] vRaptor - Upload de imagem + formulário

Pessoal, estou me batendo um pouco aqui com o envio de um formulário + foto.

Vejam um exemplo:

Uma pessoa para realizar o cadastro necessita preencher suas infos (nome, cidade, etc…) e colocar a sua foto. Todos os campos são obrigatórios, incllusive a foto.

Estou enviando meu formulário via ajax. Aqui vai a primeira pergunta: ajax consegue mandar arquivo?
Segunda: Como o pessoal que usa o vRaptor consegue driblar isto?

Realizando um exemplo simplificado:

[code]
var fields = {‘pessoa.nome’ : nome, ‘pessoa.idade’ : idade, ‘foto’ : foto};
$.post(’<c:url value="/pessoa/novo"/>’, fields, function(data) {

});[/code]

Meu controller que recebe o ajax:

[code]
@Post("/pessoa/novo")
public void savePeople(Pessoa pessoa, UploadedFile foto) {
service.save(pessoa);
peopleImage.upload(foto, pessoa);

	result.use(Results.json()).from("ok").serialize();

}[/code]

Mas essa minha foto, sempre vem null! Já tentei por um objeto File dentro do meu bean Pessoa também, como Transient do hibernate e tentar pegar o arquivo por pessoa.getFoto() mas também vem null.

O vRaptor possui algum workaround para isto?

vc precisa de um plugin javascript pra conseguir isso…

tenta o uploadify

Olá Lucas,

Dei uma olhada no uploadify e é show de bola! Mas acho que não resolve meu problema. Veja, como é obrigatório o envio da foto, eu vou ter que fazer um controller com dois métodos ao invés de receber a foto e os dados em um só? (um método para criar a pessoa e após isto chamar o outro método para dar upload na imagem?)

Além da validação que tem de ser feita lado servidor também (por motivos de segurança da aplicação), eu teria que fazer a validação no envio da foto e se for null eu teria que apagar o registro da pessoa (resultando em SQL a mais)… Convenhamos que isto não é nada performático.

Se recebesse os dados texto do form e mais o arquivo de imagem em um só controller seria muito melhor!

Algo mais ou menos assim:

@Post("/pessoa/novo")  
public void savePeople(Pessoa pessoa, UploadedFile foto) {  
        String retValor = "ok";
        boolean dadosOK = validateFormData(pessoa);
        if (dadosOK && foto != null) {
                service.save(pessoa);  
                peopleImage.upload(foto, pessoa);  
        } else {
                retValor = "nok";
        }

        result.use(Results.json()).from(retValor).serialize();  
}  

Que tal se você receber a imagem via ajax usando o uploadify. Na sua action ajax, você salva a imagem na Session do usuário que está usando.

Depois que ele terminar de preencher todos os dados, você busca essa imagem na session e remove ela de la. Dai você vai ter tudo que precisa: os dados e a imagem. Só salvar.

no uploadify dá pra enviar mais dados do que só o arquivo…

e fazer um SQL ou dois SQLs numa operação que envolve upload não faz a mínima diferença para performance… a menos que vc esteja desenvolvendo um facebook com milhões de usuários :wink:

Mondor… esse cara é a resposta do seu problema -> http://blueimp.github.com/jQuery-File-Upload/

Vou blogar sobre ele, mas ainda não arrumei tempo, mas a API dele é muito simples… vc vai fazer em 2 palitos… boa sorte

Fala galera! Então, as 3 respostas são bem válidas, muito obrigado!
Entretanto, vou optar por tentar usar o uploadify, pela ampla gama de opções.

Fiz um teste aqui, que não deu muito certo.:

<input type="file" name="bigImage" id="bigImage" multiple="false" />
<div id="queue"></div>

$('#bigImage').uploadify({ 'swf' : '<c:url value="/css/uploadify.swf"/>', 'uploader' : '<c:url value="/people/image"/>', 'folder' : 'images', 'buttonText': 'Selecionar arquivos', 'fileDataName': 'bigImage' });

[code]
@Post("/people/image")
public void saveBigImage(UploadedFile bigImage) {
// ideaImage.upload(bigImage, pessoa);

result.use(Results.json()).from(bigImage).serialize();

}[/code]

Porém debugando o código, essa bigImage vem sempre null! :// Alguma idéia?

Engraçado… Acabei de ver aqui no log:

19:26:42,029 INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload. 19:26:42,325 WARN [UploadedFileConverter] There was an error when uploading the file {}. Please verify if commons-fileupload jars are in your classpath or you are using a Servlet 3 Container.

Mas eu já tenho este JAR…

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency>

São estes jars mesmo, certo? Inclusive, verifiquei na References Libraries e estava lá: commons-fileupload-1.2.2.jar

se vc ta com a ultima versao do VRaptor, tente criar esse arquivo:

@Convert(UploadedFile.class)
public class UploadedFileConverter implements Converter<UploadedFile> {

    private final HttpServletRequest request;

    public UploadedFileConverter(HttpServletRequest request) {
        this.request = request;
    }

    public UploadedFile convert(String value, Class<? extends UploadedFile> type, ResourceBundle bundle) {
        Object upload = request.getAttribute(value);
		return type.cast(upload);
    }

}

isso deve corrigir

òtimo! o warn sobre o commons-fileupload sumiu, porém o arquivo ainda vem null no meu controller, e o info continua aparecendo:

ative o log de debug do vraptor e poste aqui o que aparece

21:07:23,266 DEBUG [VRaptor ] VRaptor received a new request 21:07:23,266 DEBUG [VRaptor ] VRaptor received a new request 21:07:23,346 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CommonsUploadMultipartInterceptor 21:07:23,346 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CommonsUploadMultipartInterceptor 21:07:23,355 INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload. 21:07:23,355 INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload. 21:07:23,372 DEBUG [CommonsUploadMultipartInterceptor] Using repository C:\Users\joao\AppData\Local\Temp for file upload 21:07:23,372 DEBUG [CommonsUploadMultipartInterceptor] Using repository C:\Users\joao\AppData\Local\Temp for file upload 21:07:23,498 DEBUG [CommonsUploadMultipartInterceptor] Found 3 attributes in the multipart form submission. Parsing them. 21:07:23,498 DEBUG [CommonsUploadMultipartInterceptor] Found 3 attributes in the multipart form submission. Parsing them. 21:07:23,516 DEBUG [CommonsUploadMultipartInterceptor] Filename is a field 21:07:23,516 DEBUG [CommonsUploadMultipartInterceptor] Filename is a field 21:07:23,533 DEBUG [CommonsUploadMultipartInterceptor] Filedata is a file 21:07:23,533 DEBUG [CommonsUploadMultipartInterceptor] Filedata is a file 21:07:23,558 DEBUG [VRaptorRequest ] Setting Filedata with [Filedata] 21:07:23,558 DEBUG [VRaptorRequest ] Setting Filedata with [Filedata] 21:07:23,569 DEBUG [CommonsUploadMultipartInterceptor] Uploaded file: Filedata with [uploadedFile uploadedCompleteName=people.png uploadedName=people.png contentType=application/octet-stream] 21:07:23,569 DEBUG [CommonsUploadMultipartInterceptor] Uploaded file: Filedata with [uploadedFile uploadedCompleteName=people.png uploadedName=people.png contentType=application/octet-stream] 21:07:23,586 DEBUG [CommonsUploadMultipartInterceptor] Upload is a field 21:07:23,586 DEBUG [CommonsUploadMultipartInterceptor] Upload is a field 21:07:23,611 DEBUG [VRaptorRequest ] Setting Filename with [people.png] 21:07:23,611 DEBUG [VRaptorRequest ] Setting Filename with [people.png] 21:07:23,624 DEBUG [VRaptorRequest ] Setting Upload with [Submit Query] 21:07:23,624 DEBUG [VRaptorRequest ] Setting Upload with [Submit Query] 21:07:23,647 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 21:07:23,647 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 21:07:23,659 DEBUG [DefaultResourceTranslator] trying to access /people/image 21:07:23,659 DEBUG [DefaultResourceTranslator] trying to access /people/image 21:07:23,675 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: peopleController.saveBigImagepeopleController.saveBigImage(UploadedFile)] 21:07:23,675 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: peopleController.saveBigImagepeopleController.saveBigImage(UploadedFile)] 21:07:23,710 DEBUG [IogiParametersProvider] IogiParametersProvider is up 21:07:23,710 DEBUG [IogiParametersProvider] IogiParametersProvider is up 21:07:23,732 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 21:07:23,732 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 21:07:23,742 DEBUG [JstlLocalization ] couldn't find message bundle, creating an empty one 21:07:23,742 DEBUG [JstlLocalization ] couldn't find message bundle, creating an empty one 21:07:23,754 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for peopleController.saveBigImage(UploadedFile) as [bigImage] 21:07:23,754 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for peopleController.saveBigImage(UploadedFile) as [bigImage] 21:07:23,764 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(Upload -> Submit Query), Parameter(Filename -> people.png), Parameter(Filedata -> Filedata)) an d targets [Target(name=bigImage, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)]. 21:07:23,764 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(Upload -> Submit Query), Parameter(Filename -> people.png), Parameter(Filedata -> Filedata)) an d targets [Target(name=bigImage, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)]. 21:07:23,793 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: peopleController.saveBigImagepeopleController.saveBigImage(UploadedFile)] are [null] 21:07:23,793 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: peopleController.saveBigImagepeopleController.saveBigImage(UploadedFile)] are [null] 21:07:23,809 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor 21:07:23,809 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor 21:07:23,822 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor 21:07:23,822 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor 21:07:23,860 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor 21:07:23,860 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor 21:07:23,876 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor 21:07:23,876 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor 21:07:23,896 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor EnvironmentInterceptor 21:07:23,896 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor EnvironmentInterceptor 21:07:23,911 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor 21:07:23,911 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor 21:07:23,920 DEBUG [ExecuteMethodInterceptor] Invoking peopleController.saveBigImage(UploadedFile) 21:07:23,920 DEBUG [ExecuteMethodInterceptor] Invoking peopleController.saveBigImage(UploadedFile) 21:07:23,951 DEBUG [XStreamConverters ] registered Xstream converter forbr.com.caelum.vraptor.validator.MessageConverter 21:07:23,951 DEBUG [XStreamConverters ] registered Xstream converter forbr.com.caelum.vraptor.validator.MessageConverter 21:07:23,962 DEBUG [XStreamConverters ] registered Xstream converter forbr.com.caelum.vraptor.serialization.xstream.XStreamConverters$NullConverter 21:07:23,962 DEBUG [XStreamConverters ] registered Xstream converter forbr.com.caelum.vraptor.serialization.xstream.XStreamConverters$NullConverter 21:07:23,978 DEBUG [DefaultExceptionMapper] find for exception class java.lang.NullPointerException 21:07:23,978 DEBUG [DefaultExceptionMapper] find for exception class java.lang.NullPointerException 2012-10-22 21:07:23.990::WARN: /people/image br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException: You can't serialize null objects

esse nullpointer é que estou tentando result.use(Results.json()).from(bigImage).serialize(); mas o bigImage vem null…

Parameter(Filedata -> Filedata)

aparentemente o parametro do filedata tah vindo com o valor errado… tenta ver na documentação se vc tah passando a option de mudar o fileData corretamente.

Do jeito que está o UplodadedFile deveria se chamar FileData (com esse F maiusculo mesmo)

Boa! Quando eu vi o log de debug também pensei nisto na hora!
Dei uma olhada na documentação e não achei nada que possa mudar este comportamento. Por via das dúvidas, mudei o meu controller mesmo, sem problemas :wink:

Mas agora tá acontecendo o inverso. Provável que não esteja sabendo usar o plugin.
Consegue dar mais esta luz?

Veja:

[code]
var fields = {‘pessoa.nome’ : nome, ‘pessoa.idade’ : idade};

$(’#bigImage’).uploadify({
‘swf’ : ‘<c:url value="/css/uploadify.swf"/>’,
‘uploader’ : ‘<c:url value="/pessoa/novo"/>’,
‘folder’ : ‘images’,
‘buttonText’: ‘Selecionar arquivos’,
‘auto’ : false, // Não manda automaticamente o arquivo, só quando mandar.
‘formData’ : fields // Teoricamente, os campos do formulário
});[/code]

No submit do form:

Segundo a documentação: “To upload multiple files, add each fileID as an argument. If ?*? is passed as the first and only argument, all files in the queue will be uploaded.”

[code]
@Post("/pessoa/novo")
@OnlyLogged
public void savePeople(People pessoa, UploadedFile Filedata) {
// TODO validacao
service.save(pessoa);

if (Filedata != null) {
	peopleImage.upload(Filedata, pessoa);
}
	
result.use(Results.json()).from(Filedata).serialize();
result.use(Results.json()).from("ok").serialize();

}[/code]

Agora o meu objeto pessoa que não está vindo certinho, vem tudo vazio os atributos nome e idade… Lembrando que já fiz um teste e a variável fields está com o valor dos campos certinho!
Alguma idéia?

Obs.: ao menos agora a imagem chega certinho no controller :slight_smile:

os dados de pessoa aparecem no log de debug do vraptor?

Não encontrei nada pelo menos…

21:44:04,797 DEBUG [VRaptor ] VRaptor received a new request 21:44:04,797 DEBUG [VRaptor ] VRaptor received a new request 21:44:04,871 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CommonsUploadMultipartInterceptor 21:44:04,871 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CommonsUploadMultipartInterceptor 21:44:04,881 INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload. 21:44:04,881 INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload. 21:44:04,893 DEBUG [CommonsUploadMultipartInterceptor] Using repository C:\Users\joao\AppData\Local\Temp for file upload 21:44:04,893 DEBUG [CommonsUploadMultipartInterceptor] Using repository C:\Users\joao\AppData\Local\Temp for file upload 21:44:04,969 DEBUG [CommonsUploadMultipartInterceptor] Found 3 attributes in the multipart form submission. Parsing them. 21:44:04,969 DEBUG [CommonsUploadMultipartInterceptor] Found 3 attributes in the multipart form submission. Parsing them. 21:44:04,978 DEBUG [CommonsUploadMultipartInterceptor] Filename is a field 21:44:04,978 DEBUG [CommonsUploadMultipartInterceptor] Filename is a field 21:44:04,988 DEBUG [CommonsUploadMultipartInterceptor] Filedata is a file 21:44:04,988 DEBUG [CommonsUploadMultipartInterceptor] Filedata is a file 21:44:04,998 DEBUG [VRaptorRequest ] Setting Filedata with [Filedata] 21:44:04,998 DEBUG [VRaptorRequest ] Setting Filedata with [Filedata] 21:44:05,008 DEBUG [CommonsUploadMultipartInterceptor] Uploaded file: Filedata with [uploadedFile uploadedCompleteName=people.png uploadedName=people.png contentType=application/octet-stream] 21:44:05,008 DEBUG [CommonsUploadMultipartInterceptor] Uploaded file: Filedata with [uploadedFile uploadedCompleteName=people.png uploadedName=people.png contentType=application/octet-stream] 21:44:05,018 DEBUG [CommonsUploadMultipartInterceptor] Upload is a field 21:44:05,018 DEBUG [CommonsUploadMultipartInterceptor] Upload is a field 21:44:05,028 DEBUG [VRaptorRequest ] Setting Filename with [people.png] 21:44:05,028 DEBUG [VRaptorRequest ] Setting Filename with [people.png] 21:44:05,038 DEBUG [VRaptorRequest ] Setting Upload with [Submit Query] 21:44:05,038 DEBUG [VRaptorRequest ] Setting Upload with [Submit Query] 21:44:05,058 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 21:44:05,058 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 21:44:05,070 DEBUG [DefaultResourceTranslator] trying to access /people/new 21:44:05,070 DEBUG [DefaultResourceTranslator] trying to access /people/new 21:44:05,083 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: PeopleController.savePeoplePeopleController.savePeople(People, UploadedFile)] 21:44:05,083 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: PeopleController.savePeoplePeopleController.savePeople(People, UploadedFile)] 21:44:05,100 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor 21:44:05,100 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor 21:44:05,113 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor 21:44:05,113 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor 21:44:05,162 DEBUG [IogiParametersProvider] IogiParametersProvider is up 21:44:05,162 DEBUG [IogiParametersProvider] IogiParametersProvider is up 21:44:05,182 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 21:44:05,182 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 21:44:05,192 DEBUG [JstlLocalization ] couldn't find message bundle, creating an empty one 21:44:05,192 DEBUG [JstlLocalization ] couldn't find message bundle, creating an empty one 21:44:05,202 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for PeopleController.savePeople(People, UploadedFile) as [people, Filedata] 21:44:05,202 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for PeopleController.savePeople(People, UploadedFile) as [people, Filedata] 21:44:05,213 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(Upload -> Submit Query), Parameter(Filename -> people.png), Parameter(Filedata -> Filedata)) an d targets [Target(name=people, type=class com.peoplemind.model.People), Target(name=Filedata, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)]. 21:44:05,213 DEBUG [IogiParametersProvider] getParametersFor() called with parameters Parameters(Parameter(Upload -> Submit Query), Parameter(Filename -> people.png), Parameter(Filedata -> Filedata)) an d targets [Target(name=people, type=class com.peoplemind.model.People), Target(name=Filedata, type=interface br.com.caelum.vraptor.interceptor.multipart.UploadedFile)]. 21:44:05,234 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for People() as [] 21:44:05,234 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for People() as [] SLF4J: Failed toString() invocation on an object of type [com.peoplemind.model.People] java.lang.NullPointerException at com.peoplemind.model.common.EntityObject.hashCode(EntityObject.java:42) at java.lang.Object.toString(Object.java:219) at org.slf4j.helpers.MessageFormatter.safeObjectAppend(MessageFormatter.java:304) at org.slf4j.helpers.MessageFormatter.deeplyAppendParameter(MessageFormatter.java:276) at org.slf4j.helpers.MessageFormatter.objectArrayAppend(MessageFormatter.java:323) at org.slf4j.helpers.MessageFormatter.deeplyAppendParameter(MessageFormatter.java:297) at org.slf4j.helpers.MessageFormatter.arrayFormat(MessageFormatter.java:230) at org.slf4j.helpers.MessageFormatter.format(MessageFormatter.java:152) at org.slf4j.impl.Log4jLoggerAdapter.debug(Log4jLoggerAdapter.java:251) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:136) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54) at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:324) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:879) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:741) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522) 21:44:05,485 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: PeopleController.savePeoplePeopleController.savePeople(People, UploadedFile)] are [[FAILED toString()], [uploa dedFile uploadedCompleteName=people.png uploadedName=people.png contentType=application/octet-stream]] 21:44:05,485 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: PeopleController.savePeoplePeopleController.savePeople(People, UploadedFile)] are [[FAILED toString()], [uploa dedFile uploadedCompleteName=people.png uploadedName=people.png contentType=application/octet-stream]] 21:44:05,520 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor

aparentemente os dados não estão indo mesmo… dá uma olhada se vc tah vendo a doc certa do plugin…

pior dos casos vc pode separar o upload do resto do formulario e fazer soh ele via ajax.

Mondor, dah uma olha nesse blog…

abrass

Pessoal, eu to com um problema parecido com esse, por isso não abri outro tópico.

Eu tenho no meu formulário de cadastro e edição de produto a opção de colocar ou não a foto/imagem do mesmo.
Quando eu coloco a foto beleza, mas quando eu não coloco dá um “Invalid upload” quando eu executo o validator
Essa imagem não é de cadastro obrigatório

public void altera(final Produto produto, final UploadedFile imagem) {
        validator.validate(produto);
...
...
...

Tem como eu corrigir isso?

To usando o vraptor 3.4.1

crie uma classe igual a essa:

mas sem o if.

isso deve funcionar.