Problema Complexo com Struts

26 respostas
N

Pessoal assim… to muito perdido… caso alguem me der uma luz eu agradeço meu problema é o seguinte…

Em uma tela JSP eu tenho q selecionar um arquivo com extensão .jpg e assim q carregar esse arquivo ele sera mostrado na tela… alguem poderia me dar um help…

Como usar isso com Struts…

Abs

26 Respostas

danieldestro

File Upload com Struts: http://www.roseindia.net/struts/strutsfileupload.shtml

Depois de fazer o upload você precisará ter este arquivo em algum lugar (disco, BD, memória) para poder exibir.

N

Brigadão cara… achei a luz no fim do tunel… qualquer dúestarei colocando de novo

brigadão e abs…

N

Pessoal queria mostrar a imagem carregada apartir do arquivo na mesma tela…

segue: meu código…

<%@ taglib uri="/tags/struts-html" prefix=“html”%>
<%@ taglib uri="/tags/struts-bean" prefix=“bean”%>

html:html
Cadastro

Arquivo

carregar Próximo

////////////////////////////////////////////////////////////////////////////////////

A imagem q eu carregar irá aparecer na mesma tela… assim como tem quando coloca a foto no site do guj…

Fico no aguardo de ajudas…

Abs

danieldestro

Tudo bem… foi o que eu disse lá em cima.

Você terá de carregar o arquivo e então armazená-lo em algum lugar, seja no disco, no BD, em memória, FTP, etc.

Daí então, você pode construir um Servlet ou Action ou JSP que leia esta imagem e a exiba.

N

Não entendi direito cara desculpa ai mas estou começando agora… depois q eu carrego ele… eu armazeno ele como em algum desses lugares… akele link q vc me passou eu segui ele e ele faz td certinho da o tamanho… o nome… o tipo e da um array de char… então é nele q deve ser armazenado o imagem ou algo assim…

Valeu

danieldestro

Cara, qual o propósito da sua aplicação? É apenas subir o arquivo e exibir? Ou deve tbm armazenar esse arquivo em algum lugar?

Se for só exibir, guarda os bytes da imagem na sessão, por exemplo, e crie um jsp/servlet para exibir a imagem.

Exemplo:

Na Action:

session.setAttribute("img",myFile.getFileData()); //cuidado ao guardar isso na sessão, pode ser grande demais

E no seu JSP de retorno:

&lt;img src="exibeImg.jsp"&gt;

Ai vc cria o JSP exibeImg.jsp:

out.print( (byte[]) session.getAttribute("img") );

Algo mais ou menos assim. Você deveria ter o conhecimento básico do Java e Servlets para saber o que está fazendo, e não se basear em exemplinhos prontos.

Se for armazenar em algum lugar, veja como gravar os dados lá e siga mais ou menos a mesma idéia.

N

Cara desculpa pela minha ignorncia é q estou começando agora...

Mas meu problema é o seguinte... eu não preciso gravar o arquivo não... só exibir... mas assim eu tenho q exibir ele na mesma tela q eu faço o upload... igual como é feito aki no site do guj... quando eu carrego a foto ela aparece na hora na parte de cima... eu fiz meus códigos assim ...

action
package projeto.estudo.struts.study;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.taglib.bean.StrutsTag;
import org.apache.struts.upload.FormFile;

public class UploudAction extends Action{
	
	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		MenuForm arquivoForm = (MenuForm) form;
		FormFile meuArquivo = arquivoForm.getArquivo();
		
		 String contentType = meuArquivo.getContentType(); //tipo do indice
	     String fileName    = meuArquivo.getFileName();    //nome do arquivo
	     int fileSize       = meuArquivo.getFileSize();    //tamanho do arquivo
	     byte[] fileData    = meuArquivo.getFileData();    //
	     
	     System.out.println("contentType: " + contentType);
	     System.out.println("File Name: " + fileName);
	     System.out.println("File Size: " + fileSize);
	     
	     
	     request.setAttribute("imagem", meuArquivo.getFileData());
	     
	       return map.findForward("ok");
	}
}
JSP
<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

<html:html>

<font size="4">Cadastro</font>

<img src="
<%= request.getAttribute("imagem") %>"> // isso pode ser feito
<html:form action="/FileUpload" method="post" enctype="multipart/form-data"><p><p>
Arquivo
<html:file property="arquivo"/></td>
</tr>
<tr>
<html:submit>carregar</html:submit>
</tr>
</html:form>
</body>
</html:html>

Então não parece o desenho...

danieldestro

A tag HTML <img> precisa do atributo src informando o caminho da imagem. Ela NÃO recebe os bytes da imagem ali.

Olha meu exemplo de cima e verás como eu fiz.

N

então fica assim minha JSP...

<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

<html:html>

<font size="4">Cadastro</font>

<img src="ok.jsp">

<body>
<html:form action="/FileUpload" method="post" enctype="multipart/form-data"><p><p>
Arquivo
<html:file property="arquivo"/></td>
</tr>
<tr>
<html:submit>carregar</html:submit>
</tr>
</html:form>


</body>
</html:html>
onde vai a resposta fica assim:
<%@ taglib uri="/tags/struts-html" prefix="html"%>

<html:html>
<head><title>SUCESSO</title></head>
<body>
<%= request.getAttribute("imagem")%> 
</body>
</html:html>

e o resultado foi

[B@19576c3

Cara desde já te agradeço... agora eu to mais perdido ainda

[color=red]SEMPRE USE A TAG [code] para exibir seus códigos.[/color]

danieldestro

É o que eu to te dizendo. Você NÃO vai conseguir exibir a imagem jogando os bytes dela direto no corpo do HTML.

Você tem que visualizar que no JSP vc está gerando o corpo do HTML.

E você deve saber que no HTML você precisa da tag <img> para exibir uma imagem. Esta imagem deve estar no servidor, disponivel por uma URL.

No seu caso não tem uma URL pra imagem física, mas você pode colocar a URL para um JSP que lê a imagem da memória, no seu caso, e imprime os bytes no output da IMAGEM.

Na sua action adicione:

session.setAttribute("img",myFile.getFileData());

No seu JSP coloque:

&lt;img src="exibeImg.jsp"&gt;

E crie um exibeImg.jsp assim:

out.print( (byte[]) session.getAttribute("img") );

Eu te dei a faca e o queijo todo cortadinho nã sua mão. Moleza maior não há!

N

Cara fiz td q vc falo... queria saber se são só esses erros q tem na minha aplicação ou falta muita coisa... compilei...

deu esse erro

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.Integer

____________________________________________________________
inde.jsp

<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

<html:html>

<font size="4">Cadastro</font>

<img src="ok.jsp">

<body>
<html:form action="/FileUpload" method="post" enctype="multipart/form-data"><p><p>
Arquivo
<html:file property="arquivo"/></td>
</tr>
<tr>
<html:submit>carregar</html:submit>
</tr>
</html:form>


</body>
</html:html>
Action
package projeto.estudo.struts.study;

import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.taglib.bean.StrutsTag;
import org.apache.struts.upload.FormFile;

public class UploudAction extends Action{
	
	
	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		MenuForm arquivoForm = (MenuForm) form;
		
		FormFile meuArquivo = arquivoForm.getArquivo();
		
		 String contentType = meuArquivo.getContentType(); //tipo do indice
	     String fileName    = meuArquivo.getFileName();    //nome do arquivo
	     int fileSize       = meuArquivo.getFileSize();    //tamanho do arquivo
	     byte[] fileData    = meuArquivo.getFileData();    //
	     
	     InputStream entrada = meuArquivo.getInputStream(); 
	     
	     System.out.println("contentType: " + contentType);
	     System.out.println("File Name: " + fileName);
	     System.out.println("File Size: " + fileSize);
	     
	     HttpSession session = request.getSession(true);
	     
	     session.setAttribute("imagem",meuArquivo.getFileSize());
	     
	       return map.findForward("ok");
	     
		
	}

}
ok.jsp
<%@ taglib uri="/tags/struts-html" prefix="html"%>

<html:html>
<head><title>SUCESSO</title></head>
<body>
<%= (byte[]) session.getAttribute("imagem") %> 


</body>

</html:html>

:x

Valeu

danieldestro

Mude de:

... session.setAttribute("imagem",meuArquivo.getFileSize()); ...

para:

... session.setAttribute("imagem",meuArquivo.getFileData()); ...

E o seu ok.jsp deve conter SOMENTE o que eu falei para você ali em cima:

<%out.printn((byte[]) session.getAttribute("imagem"); %>
N

Ele continua mandando o valor do objeto e não a imagem... mudei conforme vc disse ta certo...

Jsp

<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

<html:html>

<font size="4">Cadastro</font>

<img src="ok.jsp">

<body>
<html:form action="/FileUpload" method="post" enctype="multipart/form-data"><p><p>
Arquivo
<html:file property="arquivo"/></td>
</tr>
<tr>

<html:submit>carregar</html:submit>
</tr>
</html:form>


</body>
</html:html>

Action

import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.taglib.bean.StrutsTag;
import org.apache.struts.upload.FormFile;

public class UploudAction extends Action{
	
	
	public ActionForward execute(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		MenuForm arquivoForm = (MenuForm) form;
		
		FormFile meuArquivo = arquivoForm.getArquivo();
		
		 String contentType = meuArquivo.getContentType(); //tipo do indice
	     String fileName    = meuArquivo.getFileName();    //nome do arquivo
	     int fileSize       = meuArquivo.getFileSize();    //tamanho do arquivo
	     byte[] fileData    = meuArquivo.getFileData();    //
	     
	     InputStream entrada = meuArquivo.getInputStream(); 
	     
	     System.out.println("contentType: " + contentType);
	     System.out.println("File Name: " + fileName);
	     System.out.println("File Size: " + fileSize);
	     
	     HttpSession session = request.getSession(true);
	     
	     session.setAttribute("imagem",meuArquivo.getFileData());
	     
	       return map.findForward("ok");
	     
		
	}

}

jsp

<%= (byte[]) session.getAttribute("imagem") %>

Ta obscuro isso

danieldestro

Bem, o seu JSP não está como eu falei.

Mesmo assim eu tbm cometi um pequeno equivoco.

Se usa Java 5:

&lt;% byte[] img = (byte[]) session.getAttribute("imagem"); for( byte b : img ) out.print( b ); %&gt;

Senão:

&lt;% byte[] img = (byte[]) session.getAttribute("imagem"); for( int i=0; i&lt;img.length; i ++ ) out.print( img[i] ); %&gt;

N

Não to entendendo qual jsp não esta do jeito q vc disse… td oq vc pediu pra eu fazer eu fiz certo…

E com esses for’s deu uma sequencia de caracteres a resposta… não a imagem…

N

Usando java script da certo... será q não da pra usa com struts... da uma olhada nesse codigo seleciona uma figura e clica em java ...

<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

<html:html>

<font size="4">Cadastro</font>

<img src= "ok.jsp">

<body>
<html:form action="/FileUpload" method="post" enctype="multipart/form-data"><p><p>
Arquivo
<html:file property="arquivo"/></td>
</tr>
<tr>
<input type="button" value="JAVA" onclick="doPreview();"/>

<html:submit>carregar</html:submit>
</tr>
</html:form>


</body>
</html:html>

<script>
function doPreview(){
  var filename = document.getElementsByName("arquivo")[0].value;
  
  var img = new Image();
  
  if (navigator.appName == "Netscape")
  {
    alert("Previews do not work in Netscape.");
  }
  else
  {
    img.src = filename;
    alert(document.images[0]);
    document.images[0].src = img.src;
  }
}

</script>
danieldestro

Você precisa entender o que você está fazendo antes de mais nada.

Problema: Você tem uma tela pra enviar uma imagem e deseja exibir nesta mesma tela a imagem enviada.

Solução:

  1. Criar um JSP para enviar e exibir a imagem
  2. Criar uma Action Struts que recebe e processa a imagem
  3. Criar um mecanismo para exibir a imagem recebida/processada

No ambiente web/http, você envia dados via uma requisição HTTP, utilizando, por exemplo, um formulário html. Para exibir uma imagem numa página HTML vc deve usar a tag <img>.

Esta tag img exibe uma imagem a partir de uma URL, que pode mapear um arquivo em disco no servidor, ná área publica na web.

No seu caso você não tem esta imagem em disco. Você terá de carregá-la ao servidor e exibi-la.

Para isso você poderia:

  • Gravar a imagem recebida no disco (numa área web) e pegar a URL pra exibi-la
    ou
  • Guardar a imagem no disco (área restrita p/ web), ou BD ou mesmo em memória. Para exibir você precisa de um mecanismo para pegar os dados (bytes) da imagem e enviar via protocolo HTTP para o navegador/cliente.

Como o seu caso é o segundo, temos:

A sua Action recebe a imagem e coloca na sessão os BYTES dessa imagem carrega. Então você armazenou a sua img na sessão (embora não seja uma estratégia muito legal). Mas enfim.

Então você retorna (forward) o processamento para o seu JSP original, que tem a tag IMG que vai exibir a imagem que está em memória. Só que esta tag IMG aponta para um JSP e não para uma URL de uma imagem.

PORQUE???

Porque esse JSP vai carregar os bytes da imagem (que está na sessão) e vai gravar os bytes na saída HTTP dele. Ou seja, seu JSP será um “GERADOR” de imagem.

ENTENDEU???

Por isso o seu JSP ok.jsp pega os bytes da sessão e grava os bytes na saída.

Para melhorar, o seu ok.jsp pode fornecer o mime type (content type) mais adequado e fica assim:

&lt;%@ page contentType="image/jpeg" %&gt;&lt;% byte[] img = (byte[]) session.getAttribute("imagem"); for( int i=0; i&lt;img.length; i ++ ) out.print( img[i] ); %&gt;

danieldestro

Nesse seu exemplo você não está enviando a imagem pro servidor. O Javascript apenas pega a imagem localmente e exibe.

Hoje estou com uma paciência incomensurável.

N

Brigadão Cara… bom ve se meu struts-config.xml ta certo

<action
             path="/FileUpload"
             type="projeto.estudo.struts.study.UploudAction"
             name="MenuForm"> 
             <forward name="ok" path="/ok.jsp"/> 
         </action>
danieldestro

Parece que sim!

N

Estranho pq segui passo a passo suas explicações e não foi ainda… meu to o dia inteiro na frente do pc pra fazer isso e nada… com akele for o IE encheu de numeros na tela… será q não tem q converter pra algum tipo de imagem… cara de boa segui passo a passo oq vc me passo…

Obrigado pela paciencia… afinal meu conhecimento em java ainda é academico… faz 1 semana q to no estágio

danieldestro

Segue o ZIP com o projeto.
Acabei fazendo pra ti.

Eu tinha errado no ok.jsp…
Na verdade eu tava usando o output padrão do response (PrintWriter), quando deveria usar o OutputStream.

Você deve adicionar o struts.jar e o commons-fileupload.jar no WEB-INF/lib para rodar.

N

Cara show de bola… agora funciono legal… sabia q o erro tava naquele for, não fazi sentido fazer um for no endereço do objeto…

Parabéns esse seu projetinho agora serve como base pra galera q precisar um dia disso…

Há e boas apostilas no seu site tb…

Brigadão e Abs

Fica com Deus

danieldestro

O problema não estava no laço for. Eu só me equivoquei e usei o PrintWriter (para texto) em vez do OutputStream (binário).

rodolfoliviero

Ae ronan ahuahuahau…o q o cara te falo ja te disse na sala veio, ainda nao funciono???vou postar meu codigo q fiz pra vc ver

String nome = “teste.gif”

File dir = new File(diretorio);
if(!dir.exists()) dir.mkdirs();

File aSalvar = new File(diretorio+nome);

OutputStream out = new FileOutputStream(aSalvar);

BufferedOutputStream outb = new BufferedOutputStream(out);

outb.write(  nome.Imagem.getFileData() );

obs: usa o metodo getFileData pra vc escrver o arquivo num diretorio qualquer, ai vc pega o deretorio e coloca la no src da tag img falowwwww

ivan.silva

danieldestro:
Segue o ZIP com o projeto.
Acabei fazendo pra ti.

Eu tinha errado no ok.jsp…
Na verdade eu tava usando o output padrão do response (PrintWriter), quando deveria usar o OutputStream.

Você deve adicionar o struts.jar e o commons-fileupload.jar no WEB-INF/lib para rodar.

Daniel,

Utilizei seu projeto como exemplo mais não funcionou.

  • Se eu utilizo <img src="img.jsp"> ele não carrega esse jsp;
  • Se eu coloco

<%@ page contentType="image/jpeg" import="java.io.OutputStream"%><% byte[] img = (byte[]) session.getAttribute("imagem"); OutputStream os = response.getOutputStream(); os.write( img ); %>
no lugar de <img src="img.jsp"> ocorre java.lang.IllegalStateException at org.apache.jasper.runtime.ServletResponseWrapperInclude.getOutputStream(ServletResponseWrapperInclude.java:63) at

o problema esta nessa linha OutputStream os = response.getOutputStream();

O que eu posso fazer?

Att,

Criado 21 de agosto de 2006
Ultima resposta 28 de mar. de 2010
Respostas 26
Participantes 4