1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

download com zero bytes

Bom dia. Possuo o método abaixo que envia por e-mail uma proposta.

 @Post
    public void enviarPropostaPorEmail(Proposta proposta, Email email, Anexo anexo, List<UploadedFile> files) throws IOException, Exception {
        String retorno = "Operação realizada com sucesso.";
        Util util = new Util();
        Properties props = util.servidorSMTP();
        Session session = autenticaSMTP(props, email.getUsuario(), email.getPass());
        salvaEmailEnviado(proposta, email, anexo, files);        
        /**
         * Ativa Debug para sessão
         */
        session.setDebug(false);
        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(email.getRemetente()));
            String path = servletContext.getRealPath("/WEB-INF/upload");//caminho dos arquivos            
            enviarEmail(email, message, files, path);
            Transport.send(message);
        } catch (MessagingException ex) {           
           System.out.prinln(ex);
        }        
        result.include("retorno", retorno);
        result.redirectTo(this).lista();
    }

Neste outro método, recebo os dados necessários (destinatario, assunto etc):

 public void enviarEmail(Email email, Message message, List<UploadedFile> files, String path) throws AddressException, IOException, MessagingException, Exception {
        Address[] toUser = InternetAddress
                .parse(email.getDestinatario());
        message.addRecipients(Message.RecipientType.TO, toUser);
        if (email.getCc() != null) {
            Address[] toCC = InternetAddress
                    .parse(email.getCc());//Destinatário(s)
            message.addRecipients(Message.RecipientType.CC, toCC);
        }
        if (email.getCco() != null) {
            Address[] toCCO = InternetAddress
                    .parse(email.getCco());//Destinatário(s)
            message.addRecipients(Message.RecipientType.BCC, toCCO);
        }
        message.setSubject(email.getAssunto());//Assunto
        Date dt = new Date();
        email.setDataEnvio(dt);
        email.setTipoEmail("Proposta");
        message.setSentDate(dt);
        MimeMultipart mimeMultipart = new MimeMultipart("mixed");
        MimeMultipart mimeMultipartContent = new MimeMultipart("alternative");
        MimeBodyPart contentPartRoot = new MimeBodyPart();
        contentPartRoot.setContent(mimeMultipartContent);
        mimeMultipart.addBodyPart(contentPartRoot);
        //Monta o texto na mensagem de e-mail
        MimeBodyPart mbp = new MimeBodyPart();
        mbp.setText(email.getCorpo());
        mimeMultipartContent.addBodyPart(mbp);
        //Monta os anexos na mensagem de e-mail
        adicionaAnexos(files, path, mimeMultipart);
        message.setContent(mimeMultipart);
        message.saveChanges();
        Transport.send(message);
    }

E neste método, trabalho com os anexos.

public void adicionaAnexos(List<UploadedFile> files, String path, MimeMultipart mimeMultipart) throws IOException, MessagingException {
        if (files != null) {
            for (UploadedFile uf : files) {
                MimeBodyPart mbp = new MimeBodyPart();
                File caminhoArquivo = new File(path, uf.getFileName());
                IOUtils.copyLarge(uf.getFile(), new FileOutputStream(caminhoArquivo));
                DataSource fds = new FileDataSource(caminhoArquivo);
                mbp.setDisposition(Part.ATTACHMENT);
                mbp.setDataHandler(new DataHandler(fds));
                mbp.setFileName(fds.getName());
                mimeMultipart.addBodyPart(mbp);
            }
        }
    }

Envio o email e anexo, perfeitamente.

Porém, surgiu a necessidade de salvar no banco os dados do e-mail e anexo. Eu consigo salvar nome do anexo, extensão, porém o tamanho é sempre "0" .

 public void salvaEmailEnviado(Proposta proposta, Email email, Anexo anexo, List<UploadedFile> files) throws Exception {

        email.setProposta(proposta);
        this.daoFactory.getEmailDao().salva(email);
        List<Anexo> anexos = new ArrayList<>();
        byte stream[];
        if (files != null) {
            for (UploadedFile u : files) {
                Anexo a = new Anexo();
                a.setNome(u.getFileName());
                stream = new byte[u.getFile().available()];
                u.getFile().read(stream);
                float kbytes = stream.length / 1024;
                int iSize = Math.round(kbytes);
                System.out.println(">>> " + iSize);
                a.setTamanho(iSize);
                int index = u.getFileName().lastIndexOf(".");
                String extensao = u.getFileName().substring(index + 1);
                a.setExtensao(extensao);
                a.setEmail(email);
                a.setFile(stream);
                anexos.add(a);
            }
            for (Anexo a : anexos) {
                this.daoFactory.getAnexoDao().salva(a);
            }
        }
    }

Se eu comentar o método enviarEmail , logicamente não é enviado o e-mail, mas no banco é salvo corretamente (nome do anexo, email, extensão, tamanho e file)

Onde posso estar errando nisso?

  • Nossa, isso esta me deixando doido. Recebo por email o anexo, certinho, porém quando vou fazer o download, o arquivo é salvo com o nome e extensão e quando vou abrir dá erro!!! Quando deixo "u.getFile().read(stream);" no método salvaEmailEnviado o arquivo é salvo com tamanho ZERO no banco, se tiro o "u.getFile().read(stream)", é salvo no banco com o tamanho correto, porém após o download, o arquivo não abre, como se tivesse corrompido. Alguém poderia me ajudar nisso? To perdidão nisso.

    exercitobr   04 de mai de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags vraptor email upload ou faça a sua própria pergunta.