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

Posted

技术标签:

【中文标题】在 Spring Boot 中更改上传的 MultipartFile 的编码【英文标题】:Change encoding of uploaded MultipartFile in Spring Boot 【发布时间】:2020-05-29 03:19:42 【问题描述】:

我有一个接收 MultipartFile 的端点。

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

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

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

我希望接收具有任何编码的文件,并始终强制使用我可接受的编码,例如UTF-8,然后再处理文件。

我该怎么做?

【问题讨论】:

可以使用自定义 CharacterEncodingFilter Here's a similiar question with an answer @mklepa 也许我误解了另一个问题,但我不想在整个应用程序中添加过滤器。是否可以使用过滤器? @mklepa 不,我使用的是 Spring Boot 1.5.7,我尝试了您向我提出的问题中的两种解决方案,但都没有奏效。 这个怎么样? ***.com/a/48569644/8370004 这样你就强制用户只在这个端点使用某些编码。 我会尝试,我尝试使用 spring.http 属性和过滤器,但没有成功。就我而言,我正在接收多部分文件并保存在路线中,骆驼获取文件并处理数据。 【参考方案1】:

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

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

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

【讨论】:

以上是关于在 Spring Boot 中更改上传的 MultipartFile 的编码的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:在运行时更改数据库表

Spring boot - Thymeleaf 模板 - 多个解析器

在 Spring Boot REST API 中上传文件

Spring Boot(十七):使用 Spring Boot 上传文件

企业级 Spring Boot 教程 (十七)上传文件

Spring Boot 读取用户上传的 csv 文件