codigo abaixo
VRaptor - Upload e Download de imagens no linux
25 Respostas
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.
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!!!
Oq tem nessa linha: at br.com.movy.controller.FilmeController.downloadImage(FilmeController.java:31)
File file = new File(Filme.IMAGE_PATH, filme.getImagem()); onde chama o caminho da imagem
Seu problema não é o filme que está null não?
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”;
deu nullpointer dentro do construtor do File… provavelmente filme.getImagem() está nulo…
o que vc pode fazer é retornar 404 nesse caso, usando result.notFound();
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
mas o erro tá acontecendo no download ou no upload?
no upload, ele não encontra o caminho da imagem, para ser inserida
o problema esta como inserir a imagem no servidor (o upload), colocar um caminho correto para ele inserir nas pasta
qual é o código desse método?
repository.uploadImage(file,filme);
que que insira o codigo para vc vê?
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;
}
a menos que vc queira que eu adivinhe o código, sim 
viu ai?
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?
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)
dá exception? qual?
no trecho do codigo quando uso o mdkdir, pois o linux precisa de permissão para criar a pasta
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//
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
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.
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
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.