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

11 respostas
G

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!

11 Respostas

wagner_a_lima

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.

G

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!

wagner_a_lima

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

G

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

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

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

G

Ok! Muito Obrigado!
abraço!

G

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

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

Criado 6 de outubro de 2009
Ultima resposta 8 de out. de 2009
Respostas 11
Participantes 2