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.
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 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));
}
}
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
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.
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?
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.