Изменить кодировку загруженного MultipartFile в Spring Boot - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть конечная точка, которая получает MultipartFile.

Resource upload(@PathVariable Integer id, @RequestParam MultipartFile file) throws IOException {

Этот файл обычно является .csv, который мне нужен для обработки каждой строки и сохранения данных.

Но недавно пользователь отправляет файл с кодировкой UTF-16 LE, и это добавляет много странных символов в данные.

Я хотел бы получить файл с любой кодировкой и всегда принудительно использовать мою приемлемую кодировку, например, UTF-8, перед обработкой файла.

Как я могу это сделать?

1 Ответ

0 голосов
/ 03 марта 2020

После нескольких тестов и поиска я нашел решение.

Чтобы изменить кодировку кодировки файла, мне нужно прочитать и записать файл, используя новую целевую кодировку, но для создания чего-то общего c который может получить любую кодировку, мне нужно идентифицировать исходную кодировку.

Чтобы добиться этого, я добавляю зависимость с именем UniversalDetector:

    <dependency>
        <groupId>com.github.albfernandez</groupId>
        <artifactId>juniversalchardet</artifactId>
        <version>2.3.1</version>
    </dependency>

Используя ее, я могу сделать это:

    encoding = UniversalDetector.detectCharset(file.getInputStream());
    if (encoding == null) {
        //throw exception
    }

И способ преобразования файла:

   private static void encodeFileInLatinAlphabet(InputStream source, String fromEncoding, File target) throws IOException {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(source, fromEncoding));
             BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target),
                     StandardCharsets.ISO_8859_1))) {
            char[] buffer = new char[16384];
            int read;
            while ((read = reader.read(buffer)) != -1)
                writer.write(buffer, 0, read);
        }
    }

Чтобы я мог получить любую кодировку и кодировать в нужную кодировку.

Примечание: В моем случае мне всегда нужно файл в ISO_8859_1, так что почему в методе исправлено, но вы можете получить целевой набор символов в качестве параметра.

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