Java - сжимать (ZIP) вложения из корзины S3 и прикреплять к почте - PullRequest
0 голосов
/ 08 декабря 2018

Я рассылаю пользователям отдельные (csv / html) файлы, которые имеют тенденцию становиться довольно большими.Если файлы становятся слишком большими, почта часто не приходит.Поэтому я хотел бы проверить, улучшит ли это сжатие этих файлов.В настоящее время у меня есть этот код:

 // creates message part
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    // messageBodyPart.setContent(mail, "text/html");
    messageBodyPart.setContent(mail, "text/html; charset=UTF-8");
    messageBodyPart.setFileName("file.zip");

    // creates multi-part
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    if (raw_s3_data_files.size() > 0) {

        for (int i = 0; i < raw_s3_data_files.size(); i++) {
            String raw_s3_file_location = raw_s3_data_files.get(i);

            MimeBodyPart attachPart = new MimeBodyPart();

            try {

                S3Object s3obj = s3.returnS3Object(this.bucketName, raw_s3_file_location);

                if (s3obj != null) {
                    ByteArrayDataSource byte_array_data_source = new ByteArrayDataSource(s3obj.getObjectContent(), "text/csv");
                    attachPart.setDataHandler(new DataHandler(byte_array_data_source));
                    attachPart.setFileName(raw_s3_file_location.substring(raw_s3_file_location.indexOf("/") + 1));
                    multipart.addBodyPart(attachPart);
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    // sets the multi-part as e-mail's content
    msg.setContent(multipart);

    // sends the e-mail
    Transport t = new AWSJavaMailTransport(session, null);
    t.send(msg);

Я был бы в порядке, имея 3 отдельных ZIP-файла, но один большой ZIP-файл также в порядке.Я идентифицировал этот код:

public static byte[] zipBytes(String filename, byte[] input) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    ZipEntry entry = new ZipEntry(filename);
    entry.setSize(input.length);
    zos.putNextEntry(entry);
    zos.write(input);
    zos.closeEntry();
    zos.close();
    return baos.toByteArray();
}

Но это работает с ByteArrayOutputStream вместо ByteArrayDataSource, который я использую.Есть ли способ получить ZIP-версию из каждого файла?

...