Você está na página 1de 9

Arquivo Anexado JCompany 3.3.

(Arquivo nico)
1.Crie a classe que vai receber o arquivo: Essa classe pode ser uma classe normal que vai possuir um campo do tipo blob: @SuppressWarnings("serial") @Entity @ able(name ! ""#$%&'(") @Sequence)enerator(name ! "SE*"#$%&'("+ sequence,ame ! "SE*"#$%&'(") @"ccess ype("-ield") public class ".uda"rquivo e/tends PlcArquivoVO 0 @&d @)enerated'alue(strategy ! )eneration ype."% (+ generator ! "SE*"#$%&'(") @Column(name ! "&1*"#$%&'("+ nullable ! -alse) private 2ong id3 public 2ong get&d() 0 return id3 4 @Lob @Column(name ! "&5)*"#$%&'("+ nullable ! -alse) private by e!" imagem3 (s outros atributos do arquivo -ica por sua conta+ como o nome do arquivo+ tipo taman6o+ crie a vontade+ o importante 7 ter um campo imagem e e/tends PlcArquivoVO #a en idade que vai po$$uir o arquivo% coloque o mapeamen o a$$im& @Column (name ' ()*+A,-.)VO+AJ.*A() @#o #ull @Len/ 0 (max ' 12) priva e Lon/ idArquivoA3uda4 5$$a coluna vai arma6enar o id do arquivo que $era inclu7do em ou ra abela. Crie amb8m na cla$$e concre a o ran$ien & priva e ran$ien or/.apac0e.$ ru $.upload.9orm9ile $ ru $9ile4 public or/.apac0e.$ ru $.upload.9orm9ile /e : ru $9ile() ; re urn $ ru $9ile4 < public void $e : ru $9ile(or/.apac0e.$ ru $.upload.9orm9ile $ ru $9ile) ;

0i$.$ ru $9ile ' $ ru $9ile4 < 5 priva e ran$ien A3udaArquivo arquivo4 public A3udaArquivo /e Arquivo() ; re urn arquivo4 < public void $e Arquivo(A3udaArquivo arquivo) ; 0i$.arquivo ' arquivo4 < 1.#o : ru $=con>i/ no ac ion=mapin/ da $ua l?/ica vc deve colocar a$ in>orma@Ae$&
<action path="/ajudaman" name="ajudaForm" type="com.powerlogic.ajudaArquivo.controle.struts.AjudaAction" <set-property property="arqValue !ject" value="com.powerlogic.ajudaArquivo.vo.AjudaArquivo""</set-property" <set-property property="aja#$sa" value="N"/" <set-property property="aja#Automatico" value="N"/"

8 necess9rio tirar o ":"; para que o upload do arquivo se.a -eito corretamente.

<.Crie a action que mencionada acima e coloque entre os seus m7todos esse aqui:

=>> > &gnorar qualquer acao de arquivo >= @(verride protected void /rava:imple$Preenc0e9orm(?lc"ction5apping plc5apping+ @ttpServlet#equest request+ @ttpServlet#esponse response+ 1yna"ctionAorm -+ ?lcBase'( vo+ ?lcBaseConte/t'( conte/t) t6roCs ?lcE/ception 0 log.debug("DDDDDDDDDDDDDDD Entrou em gravaSimples?reenc6eAorm")3 -.set(?lcConstantes.A(#5."% (5"C"(.&1+ vo.get&d() E "")3 => > Copia propriedades de auditoria do '( para o AormFBean+ .9 que nGo > sGo copiadas no trans-ereBeans >= try 0 -.set("usuario%lt"lteracao"+ ?roperty%tils.get?roperty(vo+ '(.%S%"#&(*%2 *"2 E#"C"())3 Simple1ateAormat sd ! neC Simple1ateAormat("dd=55=yyyy @@:mm:SS")3 -.set("data%lt"lteracao"+ sd.-ormat(?roperty%tils.get?roperty(vo+ '(.1" "*%2 *"2 E#"C"()))3 -.set("versao"+ ?roperty%tils.get?roperty(vo+ '(.'E#S"())3 4 catc6 (E/ception e) 0 i- (log.is1ebugEnabled()) log.debug("Erro ao tentar incluir props no -orm" E e)3 4 => Aim F Copia propriedades de auditoria nGo copiadas no trans-ereBeans >= == rans-ere '( para Aorm para garantir que campos preenc6idos no == antes)ravarComplementa'( == -oram mantidos getServiceAorm'(().trans-ereBeans(conte/t+ plc5apping+ request+ -+ vo+"")3 4

8 necess9rio colocar esse m7todo para o :company ignorar as aHIes -eitas com arquivos.
=>> > Copia o Struts Aile para o "rquivo '( >= @(verride protected boolean /rava:imple$An e$(?lc"ction5apping plc5apping+ 1yna"ctionAorm -orm+ @ttpServlet#equest request+ @ttpServlet#esponse response+ ?lcBase'( vo"tual+ ?lcBase'( vo"nt) t6roCs ?lcE/ception 0 ".uda'( a.uda'( ! (".uda'() vo"tual3 i- (a.uda'(.getStrutsAile() J! null) 0 AormAile -- ! a.uda'(.getStrutsAile()3 i- (-- J! null KK JString%tils.isEmpty(--.getAile,ame()) LL (--.getAileSiMe() N O)) 0 ".uda"rquivo a.uda"rquivo ! neC ".uda"rquivo()3 a.uda"rquivo.set,ome(--.getAile,ame())3 try 0 a.uda"rquivo.set&magem(--.getAile1ata())3 4 catc6 (Aile,otAoundE/ception e) 0 e.printStacP race()3 4 catc6 (&(E/ception e) 0 e.printStacP race()3 4 a.uda'(.set"rquivo(a.uda"rquivo)3 4 4 return super.gravaSimples"ntes(plc5apping+ -orm+ request+ response+

vo"tual+ vo"nt)3 4

8 necess9rio o gravaSimples"ntes para copiar o arquivo do -orm para entidade Crie o mapeamento do evento que vai -aMer o donCload :
@(verride protected 5ap /e BeyCe 0odCapApi5ven o$5$peci>ico$(5ap mapaEventos) 0 mapaEventos.put("doCnload"+"doDnload")3 return super.getQey5et6od5ap"piEventosEspeci-icos(mapaEventos)3 4

E o metodo
public "ctionAorCard doDnload("ction5apping mapping+ "ctionAorm -orm+ @ttpServlet#equest request+ @ttpServlet#esponse response) t6roCs E/ception 0 == (1( "utoFgenerated met6od stub log.debug("DDDDDDDDDDDDDDD Entrou em doCnload")3 ?lc"ction5apping plc5apping ! (?lc"ction5apping) mapping3 1yna"ctionAorm - ! (1yna"ctionAorm) -orm3 ?lc"rquivo'( arq'( ! null3 byte reportRS ! 043 : rin/ idArquivo ' reque$ ./e Parame er((idArquivo()4 i> (idArquivo E' null FF EidArquivo.equal$((()) ; )App9acade iApp9acade ' ()App9acade) /e :ervice9acade()4 arqVO ' (PlcArquivoVO) iApp9acade.ob erArquivoComple oPor)d(idArquivo)4 i> (arqVO./e Gipo()''null) arqVO.$e Gipo((G()4 < i- (arq'( J! null) 0 log.debug(""c6ou relatorio na sessao")3 (utputStream out ! response.get(utputStream()3 try 0 report ! (byteRS) arq'(.get&magem()3 String -ormato ! arq'(.get ipo()3 i- (log.is1ebugEnabled()) log.debug(""c6ou relatorio com -ormato!" E -ormato E " e vai devolver como octet")3 i- (J-ormato.equals("2")) 0 String content ype ! (String) mime ype.get(-ormato)3 i- (content ype J! null) 0 log.debug("Aormato escol6ido -oi " E content ype)3 response.reset()3 == cac6e")3 == "noFcac6e+noFstore+ma/Fage!O")3 == response.set1ate@eader("E/pires"+ 1)3 response.setBu--erSiMe(1OTU > 1OTU)3 response.setContent2engt6(report.lengt6)3 response.setContent ype(content ype)3 out.Crite(report+ O+ report.lengt6)3 4 4 == request.getSession().remove"ttribute("relatorio?lc")3 response.set@eader("Cac6eFControl"+ response.set@eader("?ragma"+ ",oF

log.debug("#emoveu relatorio da sessao")3 4 catc6 (&(E/ception e) 0 log.error("Erro -aMendo doCnload do relatorio .asper."+ e)3 4 -inally 0 == Vltimo comando deve ser o close out.-lus6()3 out.close()3 4 4 else 0 log.Carn(",ao encontrou o relatorio na sessaoJ")3 4 return null3 4

Crie o m7todo para setar o many ype do arquivo para donCload:


private 5ap mimeGype ! neC @as65ap()3 0 == ?opula os mime types. Esse cWdigo 7 e/ecutado quando a classe 7 instanciada. mime ype.put("?"+ "application=pd-")3 mime ype.put("@"+ "application=6tml")3 mime ype.put(";"+ "application=6tml")3 mime ype.put("E"+ "application=/ls")3 mime ype.put("C"+ "application=/ls")3 == CS' mime ype.put(" "+ "te/t=plain")3 mime ype.put("X"+ "application=/ml")3 mime ype.put("("+ "application=octetFstream")3 mime ype.put(")"+ " image=p.peg")3 4

#epare que o meu e/emplo+ na :S? eu passo o &1 do arquivo que vai ser -eito o donCload e na action eu recupero esse id aquivo e vou no banco buscar o arquivo. ?ara isso eu criei o m7todo no &"ppAacade da min6a aplicaHGo:
public ?lc"rquivo'( ob erArquivoComple oPor)d(String id"rquivo)t6roCs ?lcE/ception3

E no "ppAacade:
@?lc ransacao2eitura public ?lc"rquivo'( ob erArquivoComple oPor)d(String id"rquivo)t6roCs ?lcE/ception0 ".uda1"( a.uda1"( ! (".uda1"() get1"((".uda1"(.class)3 return a.uda1"(.obter"rquivoCompleto?or&d(neC 2ong(id"rquivo))3 4

E no meu 1"(:
public ".uda"rquivo ob erArquivoComple oPor)d(2ong arquivo) t6roCs ?lcE/ception 0 try 0 ".uda"rquivo arq ! (".uda"rquivo) getSession().create$uery( "-rom ".uda"rquivo as ob. C6ere ob..id ! Y").set2ong(O+ arquivo).unique#esult()3 return arq3 4 catc6 (E/ception e) 0 t6roC neC ?lcE/ception(".company.erro.generico"+ neC (b.ectRS 0 "obter"rquivo?or&d"+ e 4+ e+ log)3 4

&sso -oi -eito para o doCnload (Bai/ar o arquivo) "gora para salvar o arquivo+ vamos -aMer as operaHIes no B(J ?ara isso v9 na entidade e coloque a anotaHGo: @Plc)oC(nomeClasseBC!"com.poCerlogic.a.uda"rquivo.modelo.A3udaHO"+nomeCl asse1"(!"com.poCerlogic.a.uda"rquivo.persistencia.6ibernate.A3uda*AO") Cria a classe B( que vocZ apontar nessa anotaHGo e coloque o seguinte cWdigo nela:
public class ".udaB( ex end$ AppHO ;

)n3e e um *AO ne$$a cla$$e


priva e A3uda*AO a3uda*AO4 public A3udaHO(A3uda*AO a3uda*AO); 0i$.a3uda*AO ' a3uda*AO4 <

@Override pro ec ed void incluiAn e$(PlcHa$eVO vo) 0roD$ Plc5xcep ion ; a3u$ aArquivoAnexado(vo)4 $uper.incluiAn e$(vo)4 < private void a3u$ aArquivoAnexado(?lcBase'( vo) t6roCs @ibernateE/ception+ ?lcE/ception 0 ".uda'( a.uda'( ! (".uda'() vo3 i- (a.uda'(.get&d"rquivo".uda()J!null LL a.uda'(.get&d"rquivo".uda().int'alue()J!O)0 i- (Ja.uda1"(.veri>ica5xi$ enciaArquivo(a.uda'(.get&d"rquivo".uda()))0 i- (a.uda'(.get"rquivo()J!null)0 ".uda"rquivo a.uda"rquivo ! (".uda"rquivo) a.uda'(.get"rquivo()3 2ong id"rquivo ! a.uda1"(.inclui(a.uda"rquivo)3 a.uda'(.set&d"rquivo".uda(id"rquivo)3 4 4 4else0 i- (a.uda'(.get"rquivo()J!null)0 ".uda"rquivo a.uda"rquivo ! (".uda"rquivo) a.uda'(.get"rquivo()3 2ong id"rquivo ! a.uda1"(.inclui(a.uda"rquivo)3 a.uda'(.set&d"rquivo".uda(id"rquivo)3 4 4 4

Crie esse metodo de 'ermel6o no ".uda1"(:


public boolean veri>ica5xi$ enciaArquivo(2ong id"rquivo".uda) t6roCs @ibernateE/ception+ ?lcE/ception 0 2ist lista#esposta ! (2ist) getSession().create$uery("select ob..id -rom ".uda"rquivo as ob. C6ere ob..id ! Y").set2ong(O+id"rquivo".uda).list()3 i- (lista#espostaJ!null LL lista#esposta.isEmpty())0 2ong id ! (2ong) lista#esposta.get(O)3 i- (idJ!null) return true3 4 return -alse3 4

#epare o que ele vai -aMer. ?rimeiro ele insere o arquivo e pega o &1 dele e preenc6e na tabela do registro principal e depois manda gravar. ?ara e/cluir+ vamos seguir o mesmo pensamento+ primeiro vamos apagar o &d*arquivo"ne/ado e depois vamos e/cluir o registro na tabela. U.,a sua :S? coloque o cWdigo:
<%& <%& <%& <%& page tagli! tagli! tagli! import="com.powerlogic.jcompany.controle.'lc(onstantes" %" uri="/)*+-,-F/struts-html-el.tld" pre.i#="html" %" tagdir="/)*+-,-F/tags" pre.i#="plc"%" uri="/)*+-,-F/c.tld" pre.i#="c"%"

<td" <c/i. test="01 empty ajudaForm.map.idArquivoAjuda2"" <html/.ile property="strutsFile"/" </c/i." </td" <c/i. test="01not empty ajudaForm.map.idArquivoAjuda2"" <td" <span onclic3=4window.open5"ajudaman.do6 evento=download7idArquivo=01ajudaForm.map.idArquivoAjuda2"894 class="!t""+ai#ar Arquivo</span" </td" </c/i."

#epare que ele -unciona assim+ se .9 6ouver um arquivo gravado ele e/ibe o botGo de doCnload+ senGo ele e/ibe o campo para subir com o arquivo.. ?ara e/clusGo do arquivo eu criei um campo transiente na entidade principal:
private transient String excluiArquivo3 public String getE/clui"rquivo() 0 return e/clui"rquivo3 4 public void setE/clui"rquivo(String e/clui"rquivo) 0 t6is.e/clui"rquivo ! e/clui"rquivo3 4

,a :S? coloquei um c6ecP bo/:

<plc/cai#a:arcacao te#to="*#clui" propriedade="e#cluiArquivo" valor:arcado=";" ajuda(have=""/"

Ele esta dentro do c:- que testa se o arquivo e/iste+ ou se.a ele sW vai aparecer quando o arquivo e/istir. ,o B( no antes?ersistencia -icou assim
@(verride protected void antes?ersistencia(?lcBase'( argO+ ?lcBase'( arg1+ String argT) t6roCs ?lcE/ception 0

".uda'( a.uda'( ! (".uda'() argO3 i- (a.uda'(.getE/clui"rquivo()J!null LL a.uda'(.getE/clui"rquivo().equals("S"))0 e/clui"rquivo"ne/ado(a.uda'()3 4 super.antes?ersistencia(argO+ arg1+ argT)3 4 private void e/clui"rquivo"ne/ado(".uda'( a.uda'() t6roCs ?lcE/ception 0 i- (a.uda'(.get&d"rquivo".uda()J!null)0 2ong id"rquivoE/cluido ! a.uda'(.get&d"rquivo".uda()3 a.uda1"(.e/clui"rquivo(id"rquivoE/cluido)3 a.uda'(.set&d"rquivo".uda(null)3 a.uda'(.set"rquivo(null)3 4 4 E no 1"(: public void e/clui"rquivo(2ong id"rquivo) t6roCs ?lcE/ception 0 try 0 Session sess ! getSession()3 String sql ! " 1E2E E A#(5 A,-.)VO W@E#E )*+A,-.)VO ! :id"rquivo "3 S$2$uery query ! sess.createS$2$uery(sql.toString())3 query.set?arameter("id"rquivo"+ id"rquivo)3 query.e/ecute%pdate()3 4 catc6 (E/ception e) 0 t6roC neC ?lcE/ception(".company.erro.generico"+ neC (b.ectRS 0 "obter"rquivo?or&d"+ e 4+ e+ log)3 4 4

(nde esta de vermel6o vc deve colocar o nome da tabela e da coluna do seu banco.

Segue em ane/o um e/emplo disso implementado. ?ara vc testar na sua maquina aponte o arquivo de conte/to para um banco qualquer no arquivo a.uda"rquivo./ml 5ande gerar o esquema: 6ttp:==local6ost=a.uda"rquivo=plc=esquema.doYevento!/ E pode testar. (BS na lin6a 1[T da action ".uda"ction+ eu setei o tipo do arquivo para arq'(.set ipo(" ")3 Esse se re-ere ao mimetype que de-ine como o arquivo ser9 aberto+ o arquivo pode ser aberto de varias maneiras+ tem at7 um m7todo com os tipos. Como no meu e/emplo nGo gravei o tipo do arquivo mandei ele abrir como te/t=plain isso de-ine de acordo com sua necessidade.
private 5ap mime ype ! neC @as65ap()3 0 == ?opula os mime types. Esse cWdigo 7 e/ecutado quando a classe 7 instanciada. mime ype.put("?"+ "application=pd-")3 mime ype.put("@"+ "application=6tml")3 mime ype.put(";"+ "application=6tml")3 mime ype.put("E"+ "application=/ls")3 mime ype.put("C"+ "application=/ls")3 == CS'

mime mime mime mime 4

ype.put(" "+ "te/t=plain")3 ype.put("X"+ "application=/ml")3 ype.put("("+ "application=octetFstream")3 ype.put(")"+ " image=p.peg")3

Você também pode gostar