当前位置: 首页 > 知识库问答 >
问题:

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

鞠修雅
2023-03-14

我有一个接收MultipartFile的endpoint。

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

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

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

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

我该怎么做呢?

共有1个答案

梁豪
2023-03-14

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

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

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

 类似资料:
  • 我正在将JavaWeb应用程序转换为Spring框架,并感谢一些关于我在文件上传方面面临的问题的建议。原始代码是用org.apache.commons.fileupload. > Spring多部分文件是否包装了组织?apache.commons.文件上传,或者我可以从我的POM文件中排除这个依赖关系? 我看到了以下示例: 最初我试图按照这个例子,但总是得到一个错误,因为它无法找到这个请求参数。因

  • 我想上传带有spring-boot和vue的文件。但是,我有一个错误“415:Unsupported MediaType”。 这是我的Spring启动控制器。 而且,这是我的vue代码。 我尝试,但遇到同样的错误。我该如何修复它?

  • 我知道这个问题以前在stackoverflow上被问过。然而,我还没有找到一个答案来实际测试服务,例如使用Postman。 我已经按照留档和我的服务是几乎相同的描述留档: 当我尝试使用Postman加热我的服务时,我得到了以下错误: org.springframework.web.multipart.多部分异常:当前请求不是多部分请求 在《邮递员》杂志上,我得到了如下回报 问题是:是否可以使用邮递

  • 问题内容: 我有一个返回XML的API,它实际上是使用默认编码返回的(我相信它是UTF-8),但是现在需求已经改变,我们需要以UTF-16LE返回所有内容。 我的问题是:是否有一种简单的方法?我可以在通话结束之前访问响应,所以我想知道是否可以做类似的事情 非常感谢! 更新:提到的方法是一种使用。 我使用的是不包含它的servlet API的旧版本(2.3)。更改版本可以解决所有问题。 问题答案:

  • 我用的是Spring靴。我在控制器中调用的方法如下所示: 升级到Tomcat8后,调用此方法时会出现以下错误。我在第一行上设置了一个断点,这个断点从未到达。: 有人遇到过这个问题吗?

  • 本文向大家介绍SpringMVC 文件上传配置,多文件上传,使用的MultipartFile的实例,包括了SpringMVC 文件上传配置,多文件上传,使用的MultipartFile的实例的使用技巧和注意事项,需要的朋友参考一下 基本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下如何使用SpringMVC进行表单上的文件上传以及多个文件同时上传的步骤 文件上传项目的