Qual a melhor maneira para zipar um anexo usando Spring para enviar email?
11 respostas
Pedrosa
Tenho o seguinte método para enviar email pelo Spring, preciso zipar o anexo para enviar o email, qual a melhor maneira para pegar esse anexo que chega em um array de byte e zipar, alguém já implementou algo parecido?
protectedvoidenviarEMail(Stringfrom,Stringto,Stringsubject,Stringcorpo,StringnomeAnexo,byte[]anexo)throwsException{if(!subject.equals("")){SimpleMailMessagemsg=newSimpleMailMessage(getMessage());msg.setSubject(subject);msg.setText(subject);MimeMessagemessage=getMailSender().createMimeMessage();MimeMessageHelperhelper=newMimeMessageHelper(message,true,"UTF-8");helper.setTo(to);helper.setFrom(from);helper.setSubject(subject);if(anexo!=null){helper.addAttachment(nomeAnexo,newInputStreamResourceImpl(anexo));}else{if(corpo.equals("")){corpo="#";}}helper.setText(corpo);System.out.println("vou enviar o mail..");getMailSender().send(message);message=null;helper=null;msg=null;}}
O metodo para zipar eu conheço porem minha aplicação é web, não estou trabalhando diretamente com o arquivo e sim com seu array de bytes.
O metodo addAttachment do Spring aceita um InputStreamSource ou um File.
Meu caso é o seguinte tem upload feito com o JSF usando a classe:
org.apache.myfaces.custom.fileupload.UploadedFile
O JSF armazena esse arquivo, talvez em uma pasta temporaria não tem existe um local definido na aplicação, com isso chamo o metodo que envia o email, passando o array de bytes para o metodo addAttachment do Spring, talvez precise zipar esse arquivo na hora que é feito o upload, se tivesse o arquivo fisicamente simplesmente zipava e passava para o addAttachment que aceita um File.
Alguém tem uma luz?
Fabio_Kung
Oi Pedrosa,
Acho que um bom caminho é usar a ZipOutputStream para zipar o array de bytes:
O metodo para Zipar um array de bytes consegui, mas não gera o zip corretamente:
publicbyte[]zipaImputStream(byte[]input){Deflatercompressor=newDeflater();compressor.setLevel(Deflater.BEST_COMPRESSION);compressor.setInput(input);compressor.finish();ByteArrayOutputStreambos=newByteArrayOutputStream(input.length);// Compress the databyte[]buf=newbyte[1024];while(!compressor.finished()){intcount=compressor.deflate(buf);bos.write(buf,0,count);}try{bos.close();}catch(IOExceptione){}byte[]compressedData=bos.toByteArray();returncompressedData;}
Conforme o Kung disse preciso mesclar com a classe ZipOutputStream, alguma idéia para adaptar esse metodo?
von.juliano
Como assim não gera corretamente?
Flw! :thumbup:
Pedrosa
Por que na verdade esse método compacta um array de bytes e não gera um zip em si, mas todos os exemplos que tenho de zipar são com arquivos existentes e não com Array de bytes.
Fabio_Kung
Mas o array de bytes resultante do processo é o zip.
Eu só sugiro que você tente primeiro com a ZipOutputStream, no lugar da Deflate.
Não compilam pois precisam receber um FileInputStream e um File, o que preciso mudar para funcionar?
Pedrosa
Na verdade o metodo addAttachment do Spring recebe um File ou ImputStreamSource, a classe da aplicação InputStreamResourceImpl implementa a InputStreamSource, a briga continua o que devo mudar nesse metodo abaixo para mandar um array de bytes zipado?