org. apache .poi.openxml4j.exceptions.InvalidOperationException: Не удалось открыть указанный исходный поток zip-записи в AWS Lambda - PullRequest
0 голосов
/ 24 января 2020

Я создал простое веб-приложение, которое загружает файлы Excel (xlsx) в корзину s3. Для этого я создал лямбда-функцию AWS, которая будет получать загрузку файлов из веб-приложения внешнего интерфейса. После получения мое java приложение, развернутое в функции AWS lambda, будет считывать входной поток загруженного файла Excel. Мой код, как показано ниже:

public class ExcelFileProcessor extends FileProcessor {

@Override
public void extract() throws IOException {
    try (Workbook wb = StreamingReader.builder()
            .rowCacheSize(100)
            .bufferSize(4096)
            .open(super.getInputStream())){

        Sheet sheet = wb.getSheetAt(NumericConstant.ZERO);

        List<String[]> outerList = new ArrayList<>();

        sheet.forEach(row -> {

            List<String> innerList = new ArrayList<>();

            int startCellIndex = row.getFirstCellNum();
            int endCellIndex = row.getLastCellNum();

            for(int rw = startCellIndex; rw < endCellIndex; rw++) {
                Cell cell = row.getCell(rw, Row.MissingCellPolicy.RETURN_NULL_AND_BLANK);
                innerList.add(cell.getStringCellValue().replace(StringConstant.NEXT_LINE_STRING, 
                        StringConstant.EMPTY_STRING).trim());
            }

            outerList.add(innerList.stream().toArray(String[]::new));
        });

        List<String[]> list = outerList;

        super.setRawData(list);

        DataHandler data = new DataHandler();
        AtomicInteger count = new AtomicInteger(NumericConstant.ZERO);

        list.forEach(element -> {

            if(count.get() == NumericConstant.ZERO) {

                for(int i = NumericConstant.ZERO; i < element.length; i++) {
                    data.addColumn(String.valueOf(element[i]));
                }
            } else {
                data.addRow(element);
            }

            count.set(count.incrementAndGet());
        });

        super.setDataHandler(data);
    }
}

Это мой класс обслуживания

public class UploadService{

    public ResponseEntity<Object> processUpload(MultipartFile file, String delimiter) {

        FileProcessor processor = factory.getFileType(file.getContentType());

        processor.setFile(file);
        processor.setFileSize(file.getSize());
        processor.setDelimiter(delimiter);
        processor.setS3BucketName(s3Properties.getBucketName());
        processor.setTemPath(lambdaProperties.getDefaultFilepath());
        processor.setWritePath(s3Properties.getUploadPath().getPending());
        processor.setInputStream(file.getInputStream());
        processor.setFileName(file.getOriginalFilename());
        processor.extract();
        processor.write();
        processor.clean();
   }
}

Мой класс конечной точки

@CrossOrigin
@RestController
public class UploadEndpoint{

@Autowired
private UploadService service;

@PostMapping(value = "/upload")
@ResponseBody
public ResponseEntity<Object> processUploadedFile(@RequestPart("file") MultipartFile file, 
        @RequestPart("delimiter") String delimiter) {
    logger.debug("processUploadedFile endpoint invoked..");
    return service.processUpload(file, delimiter);
}
}

Моя загрузка. html

    <form class="md-form" method="post" action="https://xxxxxxxxxxx/upload" enctype="multipart/form-data" >
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="uploadModalLongTitle">Upload Tool</h5>
            </div>
            <div class="modal-body">
                <div class="file-field big">
                    <a class="btn-floating btn-lg white darken-2 mt-0 float-left">
                        <i class="fas fa-cloud-upload-alt" aria-hidden="true"></i>
                        <input type="file" name="file" 
                            accept=".csv,.txt,.xlsx,.dat"/>
                    </a>
                </div>
            </div>
            <div class="modal-footer">
                <button type="submit" name="upload" class="btn btn-primary mr-auto">Upload</button>
                <select class="selectpicker" data-style="btn-primary" title="Choose a delimiter" 
                    name="delimiter" id="select-delimiter">
                </select>
            </div>
        </div>
    </form>

Целью использования StreamingReader является загрузка больших файлов Excel. Я сталкиваюсь с ошибкой полного стека, как показано ниже:

  01:05:29
  org.apache.poi.openxml4j.exceptions.InvalidOperationException: Could not open the specified zip 
  entry source stream
  
  01:05:29
  at org.apache.poi.openxml4j.opc.ZipPackage.openZipEntrySourceStream(ZipPackage.java:216) ~[poi- 
  ooxml-4.1.1.jar:4.1.1]
  
  01:05:29
  at org.apache.poi.openxml4j.opc.ZipPackage.openZipEntrySourceStream(ZipPackage.java:198) ~[poi- 
  ooxml-4.1.1.jar:4.1.1]
  
  01:05:29
  at org.apache.poi.openxml4j.opc.ZipPackage.openZipEntrySourceStream(ZipPackage.java:172) ~[poi-ooxml-4.1.1.jar:4.1.1]
  
  01:05:29
  at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:153) ~[poi-ooxml-4.1.1.jar:4.1.1]
  
  01:05:29
  at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:277) ~[poi-ooxml-4.1.1.jar:4.1.1]
  
  01:05:29
  at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:186) ~[poi-ooxml-4.1.1.jar:4.1.1]
  
  01:05:29
  at com.monitorjbl.xlsx.impl.StreamingWorkbookReader.init(StreamingWorkbookReader.java:113) ~[xlsx-streamer-2.1.0.jar:na]
  
  01:05:29
  at com.monitorjbl.xlsx.impl.StreamingWorkbookReader.init(StreamingWorkbookReader.java:91) ~[xlsx-streamer-2.1.0.jar:na]
  
  01:05:29
  at com.monitorjbl.xlsx.StreamingReader$Builder.open(StreamingReader.java:251) ~[xlsx-streamer-2.1.0.jar:na]

 01:05:29 в 01:05:29 Причина: java .io.IOException: слишком большой или неправильный размер записи ZIP  01:05:29 в орг. apache .poi.openxml4j.util.ZipArchiveFakeEntry. (ZipArchiveFakeEntry. java: 43) ~ [poi-oo xml -4.1.1.jar: 4.1.1]  01 : 05: 29 в орг. apache .poi.openxml4j.util.ZipInputStreamZipEntrySource. (ZipInputStreamZipEntrySource. java: 53) ~ [poi-oo xml -4.1.1.jar: 4.1.1]  01: 05:29 в орг. apache .poi.openxml4j.op c .ZipPackage.openZipEntrySourceStream (ZipPackage. java: 214) ~ [poi-oo xml -4.1.1.jar: 4.1.1]  01:05:29 ... 59 общих кадров пропущено

Я не могу решить проблему, я уже два дня искал решение, но все еще сталкиваюсь с ошибкой .. Может кто-нибудь помочь мне с это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...