VRaptor - Upload e Download de imagens no linux

25 respostas
glesioSantos

codigo abaixo

25 Respostas

Hebert_Coelho

Opa, beleza?

Cara, quando você postar algum código aqui no GUJ coloque-o dentro das tags SEU_CODIGO_AQUI.

Seu código fica bem formatado e a gente consegue te ajudar melhor.

Seu erro está aqui:<blockquote>Caused by: java.lang.NullPointerException

at java.io.File.(File.java:279)

at br.com.movy.controller.FilmeController.downloadImage(FilmeController.java:31) </blockquote>

NEssa linha, algum valor null está sendo acessado.
glesioSantos

Desculpe de não colocar o meu codigo no local certo, mais valeu pela dica.

Então, ai que esta minha duvida, adcionei este uma valor na minha classe Filme para IMAGE_PATH = “home/glesio/Documentos/Desenvolvimento/Users/movy/filme” que seria o endereço para realizar o upload da imagem. e chamo ela pela pelo controle

e quando a imagem é chamada na view da este seguinte erro

Caused by: java.lang.NullPointerException

at java.io.File.(File.java:279)

at br.com.movy.controller.FilmeController.downloadImage(FilmeController.java:31)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessoImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:616)

at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)

 50 more

a duvida esta se o local que coloquei esta certo.

Filme.class

public static final String IMAGE_PATH = "/home/glesio/Documentos/Desenvolvimento/Users/movy/filme";

Trexo do FilmeController

@Get("/filme/{filme.id}/imagem")
	public Download downloadImage(Filme filme){
		File file = new File(Filme.IMAGE_PATH, filme.getImagem());
		
		if(!file.exists()){
			return new FileDownload(new File(Filme.IMAGE_PATH, "default.jpg"), "image/jpg","default.jpg");
		}
		
		String fileName = filme.getTitulo().replaceAll("", "-");
		
		return new FileDownload(file, "image/jpg",fileName);
	}
	
	@Delete("/filme/{filme.id}/imagem")
	public void removeImage(Filme filme){
		try {
			filme = repository.loadById(filme.getId());
			
			repository.removeImage(filme);
			
		} catch (Exception e) {
			result.include("error",e.getMessage());
		}
		
		result.redirectTo(this).exibir(filme);
	}
	
	@Post("/filme/{filme.id}/imagem")
	public void uploadImage(UploadedFile file, Filme filme){
		try {
			repository.uploadImage(file,filme);
		} catch (Exception e) {
			result.include("error",e.getMessage());
		}
		
		result.redirectTo(this).exibir(filme);
	}

Esta é a minha grande duvida seria o local de carregar esta imagem está correta, em questão de permissão no caminho ja fiz um CHMOD -R 777 “/Desenvolvimento/Users/movy/filme” mais ainda continua o mesmo erro.

valeu!!!

Hebert_Coelho

Oq tem nessa linha: at br.com.movy.controller.FilmeController.downloadImage(FilmeController.java:31)

glesioSantos

File file = new File(Filme.IMAGE_PATH, filme.getImagem()); onde chama o caminho da imagem

Hebert_Coelho

Seu problema não é o filme que está null não?

glesioSantos

pensei sobre a falta de um .jar fileupload, mais estava vendo um blog comentando que a versão do VRaptor 3.0.0 para cima não precisa deste .jar

o que desconfio é do caminho, pois quando coloquei o valor diretamente no banco de dados default.jpg ele me retorno no servidor que não encontrou o caminho “/home/glesio/Documentos/Desenvolvimento/Users/movy/filme”;

Lucas_Cavalcanti

deu nullpointer dentro do construtor do File… provavelmente filme.getImagem() está nulo…

o que vc pode fazer é retornar 404 nesse caso, usando result.notFound();

glesioSantos

Boa tarde, desculpa pela demora

O que acontece que a imagem não esta indo para o local que foi referenciado no IMAGE_PATH, não sei se estou encontrando o local para imagem, ou seja, o caminho para o upload

Lucas_Cavalcanti

mas o erro tá acontecendo no download ou no upload?

glesioSantos

no upload, ele não encontra o caminho da imagem, para ser inserida

glesioSantos

o problema esta como inserir a imagem no servidor (o upload), colocar um caminho correto para ele inserir nas pasta

Lucas_Cavalcanti

qual é o código desse método?

repository.uploadImage(file,filme);
glesioSantos

que que insira o codigo para vc vê?

glesioSantos

Este seria a minha class FilmeBusiness

@Override
	public void uploadImage(UploadedFile file, Filme filme) throws Exception{
		
		String extension = Upload.getExtension(file.getFileName());
		
		if(!Upload.isValidExtension(extension)){
			throw new Exception("Tipo de arquivo não permitido!\nUse: JPG,JPGE,JPG,GIF, BMP e PNG");
		}
		
		filme.setImagem(filme.getId()+extension);
		
		File diretorio = new File(Filme.IMAGE_PATH);
		
		if(!diretorio.exists()){
			diretorio.mkdirs();
		}
		
		IOUtils.copy(file.getFile(),new FileOutputStream(new File(diretorio,filme.getImagem())));
		
		this.updateImage(filme);
	}

	public void updateImage(Filme filme) {
		Query query = manager.createQuery("update filme set imagem =:imagem where id =:id");
		query.setParameter("imagem", filme.getImagem());
		query.setParameter("id", filme.getId());
		query.executeUpdate();
	}

e dentro do meu FilmeController pelo construtor chamo a interface FilmeRepository

FilmeRepository

public interface FilmeRepository extends IGenericRepository<Filme> {

	void uploadImage(UploadedFile file, Filme filme) throws Exception;

	void removeImage(Filme filme) throws Exception;

	
}
Lucas_Cavalcanti

a menos que vc queira que eu adivinhe o código, sim :wink:

glesioSantos

viu ai?

Lucas_Cavalcanti

ele chega a executar essa linha?

IOUtils.copy(file.getFile(),new FileOutputStream(new File(diretorio,filme.getImagem())));

e é aqui que ele dá a exception?

a exception é um FileNotFound?

glesioSantos

ai que não sei te dizer, como poderia realizar o teste deste trecho. Te pergunto uma coisa, se permissão do sistema operacional (Linux)

Lucas_Cavalcanti

dá exception? qual?

glesioSantos

no trecho do codigo quando uso o mdkdir, pois o linux precisa de permissão para criar a pasta

Lucas_Cavalcanti

blz, então esse é o problema…

vc precisa dar a permissão de escrita pra essa pasta…

tenta mudar o diretorio pra algo acessivel tipo /tmp ou /home//

glesioSantos

o endereço referenciado foi /home/glesio/Documentos/Desenvolvimento/Users/movy/filme

dei um permissão do caminho /Desenvolvimento/Users/movy/filme
um CHMOD -R 777 para todas as pasta deste grupo mais pesiste o erro

Lucas_Cavalcanti

se vc vai no terminal e roda:

ls -lah /home/glesio/Documentos/Desenvolvimento/Users/movy/filme

ele lista a pasta?

essa pasta está com todas as permissões direitinho?

tenta fazer no terminal um:

mkdir -p /home/glesio/Documentos/Desenvolvimento/Users/movy/filme

assim o sistema não precisa criar o caminho… daí vc nem precisaria fazer o código do mkdir no java.

glesioSantos

ai te pergunto, quando o tomcat carrega ele realiza este camnho? Pois coloquei um valor default.jpg no banco de dado ele me retornou o valor do caminho que criei no IMAGE_PATH

Lucas_Cavalcanti

o que vc quer dizer com “realiza esse caminho”?

teoricamente se a pasta já está criada e tem acesso de escrita, vc consegue escrever nela do jeito que vc mandou aqui sem problemas…

na hora do download é só retornar um File apontando pro mesmo lugar, que vai funcionar também.

Criado 31 de maio de 2012
Ultima resposta 4 de jun. de 2012
Respostas 25
Participantes 3