Atualização de fotos e arquivo para download [Resolvido]
11 respostas
G
gabner
Bom dia amigos do forum esse é meu primeiro post! :lol:
Bom meu problema é o seguinte:
Estou fazendo um projeto em que é possível o usuário fazer o upload de uma imagem (jpg) e visualizar essa imagem após o upload.
estou usando o netbeans 6.5 e um framework básico que o meu professor desenvolveu.
o upload esta funcionando corretamente pois observo que o arquivo se encontra na pasta do projeto após o upload. o que ocorre é que a foto só é mostrada ou
atualizada após eu rodar o projeto novamente (botão “run” do netbeans") gostaria de saber como atualizar essa foto sem precisar rodar o projeto de novo. (estou usando o Tomcat que vem com o netbeans mesmo).
O mesmo ocorre com uma planilha excel que é gerada pelo software e disponibilizada para download, a planilha baixada é sempre uma versão mais antiga da que esta na pasta do projeto.
Acho que o problema está no caminho para o arquivo que está setado dentro de sua apliação.
Digamos que sua aplicação esteja em C:\Projetos\Minha Aplicacao.
Por exemplo, se você estiver subindo o arquivo para C:\Projetos\Minha Aplicacao\web\arquivos (caminho absoluto), realmente sua aplicação não vai localizar a imagem dentro do sistema, pois quando você compila, o netbeans cria um diretório chamado build dentro da pasta do projeto que é para onde o tomcat faz a referência para execução da aplicação.
Posta o código que você está utilizando para fazer o upload da imagem e o que utiliza para mostar a imagem.
G
gabner
A Imagem é mostrada, mas para isso eu devo rodar o projeto novamente, eu acho que isso deve gerar alguma atualização do TOMCAT, quando eu faco uma atualizaçao da imagem o arquivo é atualizado mas na página fica mostrando a imagem antiga até eu rodar o projeto novamente. segue abaixo o codigo da página e do upload.
@author Gabriel
*/
public class Upload extends Action {
public String execute(HttpServletResponse response, HttpServletRequest request)
{
try {
setNextPage("cadastro/carroUsuario/resultado.jsp");// Check that we have a file upload request - Verifique se temos um arquivo para uploadbooleanisMultipart=ServletFileUpload.isMultipartContent(request);// Create a factory for disk-based file itemsFileItemFactoryfactory=newDiskFileItemFactory();// Create a new file upload handlerServletFileUploadupload=newServletFileUpload(factory);// Parse the request - Obtem a lista de dados enviados da páginaListitems;/* FileItem */items=upload.parseRequest(request);// Process the uploaded items - Verifica cada item enviado pela páginaIteratoriter=items.iterator();Stringdados="";while(iter.hasNext()){FileItemitem=(FileItem)iter.next();if(item.isFormField()){// é um campo simples ( text, radio, checkbox, ... )dados+=item.getString();}else{// é um arquivo para upload ( file )/* Save the uploaded file if its size is greater than 0. */if(item.getSize()>0){StringfileName=item.getName();// nome do arquivoStringdirName=dirName="G:\\FAETEC\\5 Modulo\\Car Manager\\CarManager\\web\\fotos\\";// local onde será gravado FilesaveTo=newFile(dirName+"foto"+dados+".jpg");item.write(saveTo);scale(dirName+"foto"+dados+".jpg",300,300,dirName+"foto"+dados+".jpg");}}}request.getSession().setAttribute("dados",dados);}catch(Exceptionex){System.out.println("Erro : "+ex.getMessage());}returngetNextPage();
Qual o valor que vai no parametro src? Algo como: “fotos/nomeDaFoto.jpg”?
O diretório do servidor não é referenciado diretamente pela aplicação.
Faça um teste:
execute a aplicação;
faça o upload de uma imagem;
abra a pasta G:\FAETEC\5 Modulo\Car Manager\CarManager\web\fotos\
copie a foto que acabou de enviar;
cole em G:\FAETEC\5 Modulo\Car Manager\CarManager\build\web\fotos\
de F5 na página que mostra as fotos.
Provavelmente sua foto agora aparecerá. Quando você recompila a aplicação, é exatamente isso que o tomcat faz, copia as fotos que estavam na pasta do seu projeto para a pasta da aplicação compilada.
Testa ai e diz se deu certo.
Dica: No fórum, para melhorar a aparência do seu código, coloque-os entre as tags “code”.
G
gabner
opa, o caminho que vai em “arquivoFoto” é “/CarManager/fotos/foto”+numero da foto+".jpg"
vou fazer o teste que você disse. depois eu posto se funcionou
G
gabner
Wagner fiz o que você disse e deu certo! alem de jogar a foto na pasta do projeto eu tambem fou jogar na pasta do build
obrigado!
G
gabner
Isso seria a forma correta de fazer? jogar tambem na pasta fotos da “Build”? ou existe alguma outra maneira de fazer isso?
muito obrigado!
wagner_a_lima
Isto está completamente errado…
Coloquei este procedimento só para mostrar o que estava acontecendo.
Imagine que você vá implantar sua aplicação em um servidor linux. Aonde ficariam salvas suas fotos?
O ideal é você pegar o caminho real de onde sua aplicação estará implantada.
File saveTo = new File(getServletContext().getRealPath("/fotos") + File.separator + nomeDoArquivo);
Dessa forma suas fotos ficarão salvas exatamente aonde sua aplicação estiver implantadas, lembrando-se apenas que caso você vá fazer um redeploy, deve-se fazer o backup das imagens que estão dentro do servidor.
G
gabner
Ok! Muito Obrigado!
abraço!
G
gabner
Na minha classe upload eu não consigo usar esse getServletContext(), como faço para conseguir usar esse metodo, ou exite outra maneira de pegar
o caminho da pasta?
Obrigado!
wagner_a_lima
O método getServletContext() pertence a classe HttpServlet (na verdade a GenericServlet que é extendida po HttpServlet), então dependendo de sua estrutura de classes, basta você passar isso como um argumento a partir de seu servlet. Achei que sua classe upload fosse um servlet.
G
gabner
É eu resolvi o problema fazendo uma sobrecarga no método “execute” para ele receber o ServletContext como parâmetro, agora está funcionando muito bem!