在spring boot中更改上传的多部分文件的编码

ifmq2ha2  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(372)

我有一个接收多部分文件的端点。

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

此文件通常是 .csv 我需要处理每一行并保存数据。
但是最近一个用户用 UTF-16 LE 编码,这会在数据中添加很多奇怪的字符。
我希望接收任何编码的文件,并始终强制使用可接受的编码,例如, UTF-8 ,然后再处理文件。
我该怎么做?

jbose2ul

jbose2ul1#

经过几次测试和搜索,我找到了解决办法。
要更改文件的字符集编码,我需要使用新的目标字符集来读写文件,但是要创建一个可以接收任何字符集的通用文件,我需要标识源字符集。
为了实现这一点,我添加了一个称为 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 因此,方法中的原因是固定的,但是您可以接收目标字符集作为参数。

相关问题