@Override
    @Transactional
    public Object downloadTransactionTallowEvidence(Member member, long id) {
        // 중복 확인
        int check = transactionRepository.checkTallowEvidence(id);

        String fileName;
        String originFileName;

        if(check == 0) {
            // transaction title 조회
            String title = transactionRepository.getTransactionTitle(id);

            // 특수 문자를 언더스코어로 대체
            originFileName = title.replaceAll("[\\\\/:*?\"<>|]", "");

            // 공백을 언더스코어로 대체
            originFileName = originFileName.replaceAll("\\s", "_");
            originFileName += "_tallow.zip";

            fileName = UUID.randomUUID().toString() + ".zip";

            // tallow_transaction_id로 tallow 목록 가져오기
            List<TallowDto.GetTallow> list = transactionRepository.getTransactionTallows(id);

            // zip 파일 생성
            ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream();

            try (ZipOutputStream out = new ZipOutputStream(zipOutputStream)) {
                for(TallowDto.GetTallow tallow : list) {
                    S3Object s3Object = amazonS3.getObject(new GetObjectRequest(bucket, tallow.getTallowEvidence()));
                    S3ObjectInputStream objectInputStream = s3Object.getObjectContent();

                    byte[] objectBytes = IOUtils.toByteArray(objectInputStream);

                    // 각 객체를 zip에 추가
                    ZipEntry zipEntry = new ZipEntry(tallow.getTallowEvidence());
                    out.putNextEntry(zipEntry);
                    out.write(objectBytes);
                    out.closeEntry();
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            byte[] zipBytes = zipOutputStream.toByteArray();

            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(zipBytes);
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(zipBytes.length);

            PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, fileName, byteArrayInputStream, metadata);
            putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);

            // zip 파일 s3 upload
            PutObjectResult awsResult = amazonS3.putObject(putObjectRequest);

            TallowTransactionFilesDto.PostTallowTransactionFiles file = TallowTransactionFilesDto.PostTallowTransactionFiles.builder()
                    .tallowTransactionId(id)
                    .fileName(fileName)
                    .originFileName(originFileName)
                    .type("TALLOW")
                    .fileType("ZIP")
                    .build();

            int dbResult = transactionRepository.insertTransactionFile(file);
        }
        else {
            TallowTransactionFilesDto.GetTallowTransactionFiles file = transactionRepository.getTallowTransactionFiles(id);

            fileName = file.getFileName();
            originFileName = file.getOriginFileName();
        }

        // aws pre-signed url 생성
        GeneratePresignedUrlRequest generatePresignedUrlRequest = getGeneratePreSignedUrlRequest(bucket, fileName, originFileName);
        URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest);

        // pre-signed url 메일 전송
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom("support@recycleledger.com");
            helper.setSubject("File download information");
            helper.setTo(member.getEmail());

            Context context = new Context();
            context.setVariable("downloadUrl", url);

            helper.setText(templateEngine.process("mail/file-download", context), true);

            javaMailSender.send(message);
        }
        catch (MessagingException e) {
            e.printStackTrace();
        }

        return null;
    }

 

  @Override
    @Transactional
    public URL downloadTransactionTallowEvidence(Member member, long id) {
        // 중복 확인
        int check = transactionRepository.checkTallowEvidence(id);

        String fileName;
        String originFileName;

        if(check == 0) {
            // transaction title 조회
            String title = transactionRepository.getTransactionTitle(id);

            // 특수 문자를 언더스코어로 대체
            originFileName = title.replaceAll("[\\\\/:*?\"<>|]", "");

            // 공백을 언더스코어로 대체
            originFileName = originFileName.replaceAll("\\s", "_");
            originFileName += "_tallow.zip";

            fileName = UUID.randomUUID().toString() + ".zip";

            // tallow_transaction_id로 tallow 목록 가져오기
            List<TallowDto.GetTallow> list = transactionRepository.getTransactionTallows(id);

            // zip 파일 생성
            ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream();

            try (ZipOutputStream out = new ZipOutputStream(zipOutputStream)) {
                for(TallowDto.GetTallow tallow : list) {
                    S3Object s3Object = amazonS3.getObject(new GetObjectRequest(bucket, tallow.getTallowEvidence()));
                    S3ObjectInputStream objectInputStream = s3Object.getObjectContent();

                    byte[] objectBytes = IOUtils.toByteArray(objectInputStream);

                    // 각 객체를 zip에 추가
                    ZipEntry zipEntry = new ZipEntry(tallow.getTallowEvidence());
                    out.putNextEntry(zipEntry);
                    out.write(objectBytes);
                    out.closeEntry();
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            byte[] zipBytes = zipOutputStream.toByteArray();

            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(zipBytes);
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(zipBytes.length);

            PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, fileName, byteArrayInputStream, metadata);
            putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);

            // zip 파일 s3 upload
            PutObjectResult awsResult = amazonS3.putObject(putObjectRequest);

            TallowTransactionFilesDto.PostTallowTransactionFiles file = TallowTransactionFilesDto.PostTallowTransactionFiles.builder()
                    .tallowTransactionId(id)
                    .fileName(fileName)
                    .originFileName(originFileName)
                    .type("TALLOW")
                    .fileType("ZIP")
                    .build();

            int dbResult = transactionRepository.insertTransactionFile(file);
        }
        else {
            TallowTransactionFilesDto.GetTallowTransactionFiles file = transactionRepository.getTallowTransactionFiles(id);

            fileName = file.getFileName();
            originFileName = file.getOriginFileName();
        }

        // aws pre-signed url 생성
        GeneratePresignedUrlRequest generatePresignedUrlRequest = getGeneratePreSignedUrlRequest(bucket, fileName, originFileName);
        URL url = amazonS3.generatePresignedUrl(generatePresignedUrlRequest);

        // pre-signed url 메일 전송
//        try {
//            MimeMessage message = javaMailSender.createMimeMessage();
//            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
//            helper.setFrom("support@recycleledger.com");
//            helper.setSubject("File download information");
//            helper.setTo(member.getEmail());
//
//            Context context = new Context();
//            context.setVariable("downloadUrl", url);
//
//            helper.setText(templateEngine.process("mail/file-download", context), true);
//
//            javaMailSender.send(message);
//        }
//        catch (MessagingException e) {
//            e.printStackTrace();
//        }

        return url;
    }

 

+ Recent posts