Я создал простое веб-приложение, которое загружает файлы 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 общих кадров пропущено
Я не могу решить проблему, я уже два дня искал решение, но все еще сталкиваюсь с ошибкой .. Может кто-нибудь помочь мне с это?