Dúvida com JSON serialização + Jquery File Upload + VRaptor

6 respostas
D

Olá pessoal.

Ao tentar efetuar o upload de um arquivo utilizando o plugin jQuery-File-Upload (http://blueimp.github.com/jQuery-File-Upload/) recebo o erro “Empty file upload result”.
Na documentação do plugin (https://github.com/blueimp/jQuery-File-Upload/wiki/Setup) diz que é necessário receber uma JSON Response.

O upload é efetuado com sucesso, o arquivo é transferido para a pasta desejada no controler do VRaptor. O problema está no retorno da mensagem, com o objeto serializado. Não sei o que estou fazendo de errado e peço que me ajudem a esclarecer esta parte.

Meu controller do VRaptor:

@Post @Path("/upload")
	public void upload(UploadedFile files) throws IOException {
		
                ArquivoUpload up = new ArquivoUpload();

		up.setName(files.getFileName());
		up.setSize(100);
		up.setUrl("none");
		up.setThumbnail_url("none");
		up.setDelete_url("none");
		up.setDelete_type("DELETE");

		System.out.println(files);
		arquivo.salva(files);

		result.use(json()).withoutRoot().from(up).serialize();// ?????
	}

No console sempre recebo a mensagem:

17:37:09,754 DEBUG [XStreamConverters   ] registered Xstream converter forbr.com.caelum.vraptor.validator.MessageConverter
17:37:09,754 DEBUG [XStreamConverters   ] registered Xstream converter forbr.com.caelum.vraptor.serialization.xstream.XStreamConverters$NullConverter

O upload é efetuado com sucesso mas a mensagem do plugin sempre é de erro.
Utilizando o log do VRaptor no console deveria imprimir o JSON?

Alguém já passou por esse problema com esse plugin? Ou tem alguma outra alternativa?

Obrigado!

6 Respostas

Lucas_Cavalcanti

dá uma olhada no uploadify, que é bem legal também…

esse result deveria gerar o json corretamente, precisa ver se está no formato que o plugin espera. tenta fazer uma requisição sem upload mesmo e ver qual é o resultado, ou usar um Firebug da vida pra ver a resposta.

D

Descobri o erro.
Também passei por outro erro (O IE tentava fazer o download da response JSON :-p) e consegui resolver com a ajuda que o Lucas Cavalcanti deu em outro post: http://www.guj.com.br/java/239545-alterar-content-type-do-vraptor-para-uso-do-ajaxupload

De acordo com a documentação, o plugin sempre espera um ARRAY como resposta de sucesso semelhante a isso:

[
  {
    "name":"picture1.jpg",
    "size":902604,
    "url":"nomeDaUrl",
    "thumbnail_url":"nomeDaUrl",
    "delete_url":"nomeDaUrl",
    "delete_type":"DELETE"
  },
]

Tive que criar uma lista no método de upload

@Post @Path("/upload")
	public void upload(UploadedFile files) throws IOException {

		ArquivoUpload up = new ArquivoUpload();
		List<ArquivoUpload> list = new ArrayList<ArquivoUpload>();

		up.setName(files.getFileName());
		up.setSize(100);
		up.setUrl("none");
		up.setThumbnail_url("none");
		up.setDelete_url("none");
		up.setDelete_type("DELETE");

		arquivo.salva(files);

		list.add(up);

	    result.use(PlainJSONSerialization.class).from(list).recursive().serialize();

Na classe PlainJSONSerialization eu fiz:

public Serializer from(Object objeto) {
        Serializer serializer = serialization.withoutRoot().from(objeto);
        response.setHeader("Content-Type", "text/plain");
        return serializer;

A mensagem de erro sumiu!

Obrigado!

cartagena

Daniel,

Eu também estou tendo problemas para usar esse plugin do jquery com o vraptor. No entato, o meu problema é no início da requisição, quando o vraptor percebe que é uma requisição multipart, mas não consegue fazer o parse do field.

O log é esse:

12-09-24 15:15:15,784 [INFO] br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor - Request contains multipart data. Try to parse with commons-upload.
12-09-24 15:15:15,785 [DEBUG] br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor - Using repository /tmp for file upload
12-09-24 15:15:15,785 [DEBUG] br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor - Found 1 attributes in the multipart form submission. Parsing them.
12-09-24 15:15:15,785 [DEBUG] br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor - A file field was empty: files

Eu sei que é um pouco fora do contexto, mas você pode me mostrar como está utilizando o plugin?

Grato

Lucas_Cavalcanti

mas o arquivo foi enviado?

cartagena

Lucas, o arquivo foi enviado sim! Eu estou usando o exemplo do site, apenas troquei a URL de action do form. Notei que quando não uso o plugin e o form se comporta como um upload “normal”, a arquivo chega certinho, sem problema nenhum.

Debugando o CommonsUploadMultipartInterceptor eu percebi o que FileItem vem todo errado, olha só:

name=, StoreLocation=/tmp/upload_22ea6187_139f98ede13__8000_00000000.tmp, size=0bytes, isFormField=false, FieldName=files

Creio que seja o modo como o plugin faz a requisição. Por isso perguntei ao Daniel como ele configurou o plugin!

Lucas_Cavalcanti

sim, qdo vc usa o plugin não é uma requisição normal, é o próprio plugin que faz…

vc só tem que tomar cuidado com o nome do input que ele usa pra requisição… precisa ser o mesmo nome do UploadedFile.

Criado 19 de julho de 2012
Ultima resposta 24 de set. de 2012
Respostas 6
Participantes 3