首页 > 其他分享 >【报错解决】The Unicode character [进] at code point [36,827] cannot be encoded as it is outside the permit

【报错解决】The Unicode character [进] at code point [36,827] cannot be encoded as it is outside the permit

时间:2024-12-30 15:54:14浏览次数:5  
标签:code UTF point 文件名 filename systemFile 报错 ResponseEntity import

读取文件的时候报错

: The HTTP response header [Content-Disposition] with value [attachment; filename="进度(导入模板).xlsx.xlsx"] has been removed from the response because it is invalid

java.lang.IllegalArgumentException: The Unicode character [进] at code point [36,827] cannot be encoded as it is outside the permitted range of 0 to 255

image

AI 解答

从错误信息来看,问题是由于HTTP响应头Content-Disposition中的文件名包含了非ASCII字符(中文字符“进”),而Tomcat服务器尝试将这个值转换为字节数组时失败了。因为Unicode字符“进”的代码点是36,827,超出了单字节表示的0到255的范围,所以导致了IllegalArgumentException

要解决这个问题,可以采取以下几种方法之一:

  1. URL编码:对Content-Disposition头中的文件名进行URL编码,确保所有非ASCII字符都被正确地转义。例如,使用URLEncoder.encode()方法来编码文件名部分。

  2. RFC 5987兼容性:遵循RFC 5987规范,它允许在HTTP头部中使用UTF-8编码的参数值。你可以构建一个符合该规范的Content-Disposition头,比如:

    Content-Disposition: attachment; filename*=UTF-8''%E8%BF%9B%E5%BA%A6%EF%BC%88%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF%EF%BC%89.xlsx
    
  3. 设置正确的字符集:确保你的应用服务器配置支持UTF-8编码。对于Tomcat,可以在server.xml中配置Connector元素的URIEncoding属性为UTF-8,以确保所有的URI被正确地解码。

  4. 使用简单的文件名:如果可能的话,避免在文件名中使用非ASCII字符,采用仅包含ASCII字符的简单文件名。

以下是使用RFC 5987格式的示例代码,假设你正在使用Spring框架:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.nio.charset.StandardCharsets;
import java.net.URLEncoder;
import java.util.Objects;

@RestController
public class FileDownloadController {

    @GetMapping("/download")
    public ResponseEntity<byte[]> downloadFile() {
        String filename = "进度(导入模板).xlsx";
        byte[] fileContent = {/* ... 文件内容 ... */};

        // 使用RFC 5987格式编码文件名
        String encodedFilename = URLEncoder.encode(filename, StandardCharsets.UTF_8)
                .replaceAll("\\+", "%20");

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, 
            "attachment; filename=\"" + filename + "\"; filename*=UTF-8''" + encodedFilename);

        return new ResponseEntity<>(fileContent, headers, HttpStatus.OK);
    }
}

这段代码确保了Content-Disposition头部能够正确处理包含非ASCII字符的文件名,并且应该能避免你遇到的异常。请根据你的具体环境和需求调整解决方案。

应用代码

    @Override
    public ResponseEntity<Resource> getFileObj(String fileMd5) {
        List<SystemFile> systemFiles = fileMapper.getFileByMd5(fileMd5);
        if (systemFiles.isEmpty()) {
            return ResponseEntity.notFound().build();
        }
        SystemFile systemFile = systemFiles.get(0);
        String realAddress = configMapper.getKeyValue(SystemConfigKey.SYS_FILE_SAVE_PATH)+systemFile.getPath(); // 真实的文件存储地址
        log.info("真实文件地址:{}", realAddress);
        Resource resource = new FileSystemResource(realAddress);

        if (resource.exists() && resource.isReadable()) {
//            return ResponseEntity.ok()
//                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + systemFile.getFileName()+systemFile.getFileType() + "\"")
//                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
//                    .body(resource);
            // 使用RFC 5987格式编码文件名
            String encodedFilename = URLEncoder.encode(systemFile.getFileName(), StandardCharsets.UTF_8)
                    .replaceAll("\\+", "%20");
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + systemFile.getFileMd5()+systemFile.getFileType()+ "\"; filename*=UTF-8''" + encodedFilename)
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .body(resource);
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
    }

标签:code,UTF,point,文件名,filename,systemFile,报错,ResponseEntity,import
From: https://www.cnblogs.com/mllt/p/18641406/solve-problem-java-file-upload-response-error-enco

相关文章

  • 针对于umi4的codeSplitting
    makojscodeSplitting类型:false|{strategy:"auto"}|{strategy:"granular",options:object}|{strategy:"advanced",options:object}默认值:false指定代码拆分策略。对于SPA使用 auto 或 granular 策略,对于MPA使用 advance 策略。//auto策略{......
  • 国标GB28181视频平台LiteGBS遇到摄像机报错用户被锁定该如何处理?
    在视频监控领域,LiteGBS国标GB28181软件作为一个广泛使用的软件,有时会遇到摄像机报错用户被锁定的问题。这种情况可能会阻碍监控系统的正常运行,影响安全监控的效率。为了解决这一问题,我们需要采取一系列标准化的检查和调整措施,以确保系统的稳定性和视频流的连续性。那么在应用中,......
  • leetcode 213. 打家劫舍 II
    213.打家劫舍II与  198.打家劫舍  相比,多了首和尾不能同时偷的条件但是没写出来......
  • 不是‘Code’是‘冒险’——软工历险记
    作业所属课程https://edu.cnblogs.com/campus/fzu/SE2024作业要求https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业的目标总结回顾这一学期的收获学号102201140小记......
  • 【YashanDB知识库】druid连接池查询空间数据报错read time out
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7849007.html?templateId=1718516【标题】druid连接池查询空间数据报错readtimeout【问题分类】驱动使用【关键字】druid,gis,readtimeout,sockettimeout【问题描述】sql查询空间数据,用HikariCP不......
  • 【YashanDB知识库】hive初始化崖山报错YAS-04209
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7849008.html?templateId=1718516【问题分类】功能使用【关键字】hadoop,hive,YAS-02058【问题描述】hive初始化崖山报错:0:jdbc:yasdb://192.168.xxx.xxx:1688/hive>CREATETABLEIFNOTEXISTSMAST......
  • leetcode 3186. 施咒的最大总伤害
    3186.施咒的最大总伤害这道题相比 740.删除并获得点数  ,区别是这道题的元素值可以特别大,所以就不能开大数组。没做出来......
  • Qt5.14.2 编译QtCipherSqlitePlugin ,_mm_aesimc_si128 (__m128i __X)报错解决
    1.在相同的cpu,相同版本的Qt5.14.2不同电脑下,编译由devbean/QtCipherSqlitePlugin作者处下载的源码。未修改任何东西的情况下,同事电脑一键即可编译成功!而本人则是尝试了很多次都无法编译成功!总是报错内联失败,目标特定选项不匹配等问题! 2.尝试多次后,在sqlitecipher.pro文件添......
  • centos6虚拟机异常关闭,启动网络报错device eth0 does not seem to be present,delayin
    centos6虚拟机所在主机直接关机,导致虚拟机异常关闭,启动虚拟机网络报错deviceeth0doesnotseemtobepresent,delayingnitialization1、查看虚拟机的mac地址 2、修改eth0的mac地址修改完成后查看文件内容,more/etc/sysconfig/network-scripts/ifcfg-eth0  3、修改70-......
  • Ubuntu 24.04 编译出现 error: ‘uint8_t’ is not a member of ‘std’; did you mea
    1.情况说明安装ubuntu24.04编译某C++开源项目时遇到上述编译报错,uint8_t不是命名空间std下的成员即std::uint8_t未定义2.原因具体原因我也不是很清楚,不过在网上搜到的一篇日本网友的文章:Ubuntu24.04にしたら、C++コンパイルでエラー(‘uint8_t’wasnotdeclaredinthi......