繁体   English   中英

在 Spring Boot 中更改上传的 MultipartFile 的编码

[英]Change encoding of uploaded MultipartFile in Spring Boot

我有一个接收 MultipartFile 的端点。

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

这个文件通常是一个.csv ,我需要处理每一行并保存数据。

但是最近用户发送了一个UTF-16 LE编码的文件,这在数据中添加了很多奇怪的字符。

我想接收带有任何编码的文件,并在处理文件之前始终强制使用我可接受的编码,例如UTF-8

我怎样才能做到这一点?

经过几次测试和搜索,我找到了解决方案。

要更改文件的字符集编码,我需要读取和写入应用新目标字符集的文件,但要创建可以接收任何字符集的通用内容,我需要识别源字符集。

为了实现这一点,我添加了一个名为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的文件,以便修复方法中的原因,但您可以接收目标字符集作为参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM