Atualização de fotos e arquivo para download [Resolvido]

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.

se vocês puderem me ajudar eu agradeço!!!

Obrigado!

Primeiramente, seja bem vindo.

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.

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.

Trecho do jsp que mostra a imagem:

        <c:if test="${ArquivoExiste == 0}">
            O carro ainda nao possui foto.<br><br>

            <form method="post" enctype="multipart/form-data" name="frm">
                <input type="hidden" name="id" value='<c:out value='${action.helper.carroUsuarioDTO.id}'/>'>
                Foto: <input type="file" name="arquivo" value=""><br>
            </form>              

        </c:if>
        <c:if test="${ArquivoExiste == 1}">
            <img src="${arquivoFoto}" width="400" height="400"/>
            <form method="post" enctype="multipart/form-data" name="frm">
                <input type="hidden" name="id" value='<c:out value='${action.helper.carroUsuarioDTO.id}'/>'>
                Alterar foto para: <input type="file"  name="arquivo" value=""><br>

            </form>

        </c:if>

minha classe upload

/*

  • Classe: Upload
  • Versão: 1.0
  • Data da ultima modificacao: 04/09/2009
  • Esse arquivo e seu conteudo sao propriedade de
  • Gabriel Abner © . Todos os direitos reservados.
    */

package br.faetec.carmanager.actions.upload;

import br.faetec.carmanager.controller.Action;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
*

  • @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 upload
    
         boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    
    
         // Create a factory for disk-based file items
    
         FileItemFactory factory = new DiskFileItemFactory();
    
    
         // Create a new file upload handler
    
         ServletFileUpload upload = new ServletFileUpload(factory);
    
    
         // Parse the request  - Obtem a lista de dados enviados da página
         
         List items; /* FileItem */
    
         items = upload.parseRequest(request);
    
    
         // Process the uploaded items - Verifica cada item enviado pela página
    
         Iterator iter = items.iterator();
         String dados = "";
         while (iter.hasNext()) {
             FileItem item = (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) {
                     String fileName = item.getName(); // nome do arquivo
                     String dirName = dirName = "G:\\FAETEC\\5 Modulo\\Car Manager\\CarManager\\web\\fotos\\"; // local onde será gravado                        
                     File saveTo = new File(dirName + "foto" + dados + ".jpg");
                     item.write(saveTo);
                     scale(dirName + "foto" + dados + ".jpg",300,300,dirName + "foto" + dados + ".jpg");
                 }
             }
         }
         request.getSession().setAttribute("dados", dados);
     } catch (Exception ex) {
         System.out.println("Erro : " + ex.getMessage());
     }
         return getNextPage();
    

    }

    public static void scale(String srcFile, int destWidth, int destHeight,
    String destFile) throws IOException
    {
    BufferedImage src = ImageIO.read(new File(srcFile));
    BufferedImage dest = new BufferedImage(destWidth, destHeight,
    BufferedImage.TYPE_INT_RGB);
    Graphics2D g = dest.createGraphics();
    AffineTransform at = AffineTransform.getScaleInstance(
    (double) destWidth / src.getWidth(),
    (double) destHeight / src.getHeight());
    g.drawRenderedImage(src, at);
    ImageIO.write(dest, “JPG”, new File(destFile));
    }
    }

Obrigado!

Continuo achando que o problema é exatamente o que falei.

Você está fazendo o upload para um diretório “qualquer” servidor.

    G:\\FAETEC\\5 Modulo\\Car Manager\\CarManager\\web\\fotos\\

Quando você coloca:

    <img src="${arquivoFoto}" width="400" height="400"/> 

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”.

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

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!

Isso seria a forma correta de fazer? jogar tambem na pasta fotos da “Build”? ou existe alguma outra maneira de fazer isso?
muito obrigado!

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. :slight_smile:

Ok! Muito Obrigado!
abraço!

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!

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.

É eu resolvi o problema fazendo uma sobrecarga no método “execute” para ele receber o ServletContext como parâmetro, agora está funcionando muito bem!