Ошибка при загрузке файла 'Имя файла'

Jmix version: 1.5.3
Jmix Studio plugin version: 2.1.0-232
IntelliJ version: IntelliJ IDEA 2023.2.5 (Ultimate Edition)

Всех приветствую.

Возникает ошибка при загрузке файла, код контроллера:

@UiController("KpApp6.browse")
@UiDescriptor("kp-app6-browse.xml")
@LookupComponent("kpApp6sTable")
public class KpApp6Browse extends StandardLookup<KpApp6> {
    private static final Logger log = org.slf4j.LoggerFactory.getLogger(KpApp6Browse.class);
    @Autowired
    private FileStorageUploadField attachmentFileField;
    @Autowired
    private TemporaryStorage temporaryStorage;

    @Subscribe("attachmentFileField")
    public void onAttachmentFileFieldFileUploadSucceed(final SingleFileUploadField.FileUploadSucceedEvent event) {
        try {
            // Получение объекта File
            File tempFile = temporaryStorage.getFile(attachmentFileField.getFileId());

            // Преобразование File в Path
            String tempFilePath = tempFile.getAbsolutePath();

            String beforeSplitCsvFileName = attachmentFileField.getFileName();
            String substr = beforeSplitCsvFileName.substring(0, beforeSplitCsvFileName.length() - 5);
            String afterSplitCsvFileName = substr + ".csv";

            // Определяем путь для CSV файла
            Path csvFilePath = Files.createTempFile("converted", ".csv");

            // Выполняем конвертацию
            convertXlsxToCsv(tempFilePath.toString(), csvFilePath.toString());

            // Определяем сетевой путь для выгрузки
            Path networkPath = Paths.get("/home/user/jar_files/csv_files", afterSplitCsvFileName);

            // Копирование файла в сетевое местоположение
            Files.copy(csvFilePath, networkPath);

            log.info("File " + afterSplitCsvFileName + " is ready" + "by path /home/user/jar_files/csv_files");
        } catch (Exception e) {
            log.info(e.getMessage());
        }
    }

    public static void convertXlsxToCsv(String xlsxFilePath, String csvFilePath) throws IOException {
        try (OPCPackage pkg = OPCPackage.open(xlsxFilePath);
             OutputStream outputStream = new FileOutputStream(csvFilePath);
             PrintWriter pw = new PrintWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) {

            XSSFReader reader = new XSSFReader(pkg);
            StylesTable styles = reader.getStylesTable();
            ReadOnlySharedStringsTable sharedStrings = new ReadOnlySharedStringsTable(pkg);
            XSSFSheetXMLHandler.SheetContentsHandler sheetHandler = new SheetToCSV(pw);

            XMLReader parser = XMLReaderFactory.createXMLReader();
            parser.setContentHandler(new XSSFSheetXMLHandler(styles, sharedStrings, sheetHandler, new DataFormatter(), false));

            // Потоковое чтение и обработка первого листа
            InputStream sheetInputStream = reader.getSheet("rId1");
            parser.parse(new InputSource(sheetInputStream));
        } catch (InvalidFormatException e) {
            log.info(e.getMessage());
            throw new RuntimeException(e);
        } catch (OpenXML4JException e) {
            log.info(e.getMessage());
            throw new RuntimeException(e);
        } catch (SAXException e) {
            log.info(e.getMessage());
            throw new RuntimeException(e);
        }
    }

    private static class SheetToCSV implements XSSFSheetXMLHandler.SheetContentsHandler {
        private final PrintWriter pw;
        private boolean firstCellOfRow = true;

        public SheetToCSV(PrintWriter pw) {
            this.pw = pw;
        }

        @Override
        public void startRow(int rowNum) {
            firstCellOfRow = true;
        }

        @Override
        public void endRow(int rowNum) {
            pw.println();
        }

        @Override
        public void cell(String cellReference, String formattedValue, XSSFComment comment) {
            if (!firstCellOfRow) {
                pw.print(',');
            }
            pw.print(formattedValue);
            firstCellOfRow = false;
        }

        @Override
        public void headerFooter(String text, boolean isHeader, String tagName) {
            XSSFSheetXMLHandler.SheetContentsHandler.super.headerFooter(text, isHeader, tagName);
        }

        @Override
        public void endSheet() {
            XSSFSheetXMLHandler.SheetContentsHandler.super.endSheet();
        }

    }
}

Безымянный

При локальном запуске проекта файл грузится, конвертируется в csv и выгружается куда нужно без всяких проблем и быстро. Но стоит поместить jar с этим же кодом на сервер Ubuntu возникает эта ошибка и при этом в логах чисто.

Добрый день!

Ошибка возникает при загрузке файлов любых размеров? Файлы меньше 1MB тоже не загружаются?

1 симпатия

Добрый!

Да, проверял и на маленьких файлах, тоже возникает ошибка

Еще не стала известна возможная причина возникновения ошибки?

Добрый день!

Пока не получается воспроизвести. Мне кажется, похожая проблема есть вот здесь: Import from excel file - #8 by mortoza_khan - Support - Jmix

Только там проект на 2.х версии и приложение деплоится в Tomcat. Не уверен, может ли это быть связано с правами.

Можете попробовать использовать Vaadin Upload компонент для тестирования? Он немного отличается от Jmix компонентов:

private static final Logger log = LoggerFactory.getLogger(MyScreenClass.class);

@Autowired
private HBoxLayout uploadLayout;
@Autowired
private TemporaryStorage temporaryStorage;

@Subscribe
public void onInit(final InitEvent event) {
    Upload upload = new Upload();

    ImageUploader imageUploader = new ImageUploader();
    upload.setReceiver(imageUploader);
    upload.addSucceededListener(imageUploader);

    uploadLayout.unwrap(JmixOrderedActionsLayout.class).addComponent(upload);
}

class ImageUploader implements Upload.Receiver, Upload.SucceededListener {
    public TemporaryStorage.FileInfo fileInfo;
    public OutputStream receiveUpload(String filename,
                                      String mimeType) {
        fileInfo = temporaryStorage.createFile();
        return createFileOutputStream(fileInfo.getFile());
    }

    public void uploadSucceeded(Upload.SucceededEvent event) {
        log.info("File uploaded: {}", event.getFilename());
        temporaryStorage.deleteFile(fileInfo.getId());
    }

    @Nullable
    protected OutputStream createFileOutputStream(File file) {
        try {
            return new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            log.error("Failed to create temporary file output stream", e);
            return null;
        }
    }
}
1 симпатия

Добрый день!
Хорошо, попробую, кттс отпишусь

Добрый день!
Использовал Vaadin Upload, итог тот же, только не выводится сообщение об ошибке разве что. Логи по ходу выполнения конвертации тоже не срабатывают. Прописывал отдельный метод FailedListener для экземпляра Upload, тоже ничего не происходит. Локально все корректно отрабатывает

Значит дело не в серверной части компонентов. Видимо загрузка даже не начинается, а ошибка падает ещё в браузере. В консоли браузера есть какие-нибудь ошибки при попытке загрузке файла?

1 симпатия

Удалось решить проблему, трабла была не в клиенте. Указали на веб-сервере ngnix client_max_body_size 100М. Эта конфигурация была либо слишком маленькой или не была указано вообще не знаю, но проблему решили. Спасибо вам

1 симпатия