Thymeleaf链接中反引号`自动转义为%60,如何获取正确下载链接?
解决Thymeleaf中文件名特殊字符`的URL编码问题
问题原因
Thymeleaf处理th:href时,会自动对URL中不符合RFC标准的字符进行编码,反引号()属于这类需要编码的字符,因此会被转成%60`,这是符合URL规范的正常行为。如果后端没有正确解码该参数,就会出现找不到对应文件的情况。
解决方案
方案1:后端正确解码请求参数(推荐)
如果使用Spring Boot这类框架,直接通过@RequestParam接收文件名参数即可,框架会自动将%60解码回原始的`。示例代码:
@GetMapping("/files") public ResponseEntity<Resource> downloadFile(@RequestParam String fileName) { // 此处的fileName已完成解码,包含原始的`字符 // 执行文件下载逻辑 }
这种方式下,即使链接中显示的是%60,后端拿到的依然是正确的原始文件名,完全不影响文件下载。
方案2:强制Thymeleaf不编码该字符(不推荐)
如果一定要让URL中显示原始的,可以通过th:utext`手动拼接内容,但这种方式会破坏URL规范,还存在XSS风险,不建议使用。示例:
<ul class="list-group list-group-item-action" th:each="file: ${filesList}"> <a th:utext="'<li class=\'list-group-item list-group-item-action\'><a href=\'http://localhost:8080/files?fileName=' + file + '\'>' + file + '</a></li>'"></a> </ul>
验证方式
在后端接收参数时打印fileName的值,如果输出为!@#$%^&()_+=-{}[]'~.doc,说明解码成功,此时无论链接中是%60还是原始,都能正常下载文件。
内容的提问来源于stack exchange,提问作者Leonard Kawhi
相关产品推荐
相关产品推荐

