URLEncoder转换字符串问题

URLEncoder转换字符串问题今天在开发过程中遇到了一个坑,关于使用URLEncoder去encode字符串的问题,是解析一个下载地址,由于下载文件名中含有空格,导致encode之后所有空格变成了“+”,url拼接自然就出错了,下载地址相应不到报了404异常,由于之前没接触过这方面的事情,也算是给自己挖了一个小坑,特此记录一下。这段是业务背景,不想看的直接跳到下一段看解决办法哈。大概是这样,公司网站原本下载各种附件的地…

大家好,又见面了,我是你们的朋友全栈君。

今天在开发过程中遇到了一个坑,关于使用URLEncoder去encode字符串的问题,是解析一个下载地址,由于下载文件名中含有空格,导致encode之后所有空格变成了“ + ”,url拼接自然就出错了,下载地址相应不到报了404异常,由于之前没接触过这方面的事情,也算是给自己挖了一个小坑,特此记录一下。

这段是业务背景,不想看的直接跳到下一段看解决办法哈。大概是这样,公司网站原本下载各种附件的地址都是自己的静态服务器,但是以后要切换到腾讯云了,不过原来的老业务里文件地址不变,由于原本的下载地址基本都是通过hard code写死前缀http://xxxx.xxx.xxx,后面再拼接上file url例如/docs/人员名单.xls,现在由于服务器的变化,前缀地址不再固定,所以在数据库表中添加了prefix字段用于存放服务器的地址,新逻辑也就成了prefix + fileUrl,原本是一个比较简单的需求,可以算是体力活,只要把原来所有涉及下载的接口或者页面的对应位置都修改了就可以了。其中有一处页面改完之后是点击按钮后直接返回拼接好的下载地址自动下载就可以了,但是由于下载的文件多数是存在中文字符的,于是在代码中使用URLEncoder对中文进行了转码,但是却忽略了文件名可能存在空格,encode之后变成了 “ + ”,导致找不到下载地址,报了404。

解决方案

其实解决这个问题很简单简单,因为毕竟都是字符串,只要手动替换一下就可以了。

String encodeStr = URLEncoder.encode(str, "UTF-8");
encodeStr = encodeStr.replaceAll("\\+","%20");

只需要将encode后的字符串中的 “+” 替换成%20就可以了,%20就代表空格。

也许你会考虑到如果文件名本身存在 “+” 怎么办,其实这个不用担心,特殊字符在encode过程中都是被转换的,加号会被转换成%2B,所以彼此之间不会影响。

另外如果有不确定的转换问题的话,可以把url放入chrome地址栏中跑一下就可以看到对应转化成什么了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148486.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月29日 上午6:16
下一篇 2022年6月29日 上午6:16


相关推荐

  • git在idea切换远程分支_python git切换分支

    git在idea切换远程分支_python git切换分支想切换到另一个分支的时候,在IDEA的右下角没找到对应的远程分支随即我来到这个地方:项目->git->Repository->pull选择我想要切换的分支原文链接:https://blog.csdn.net/u012898245/article/details/84876094感谢楼主整理提供!…

    2025年11月27日
    5
  • vue的双向绑定原理_vue2双向绑定原理

    vue的双向绑定原理_vue2双向绑定原理1、背景今天要讲的内容是Web前端框架vue.js中的一个细节,注意是细节哦,稍不留神就掉坑里了。由于这两天在公司开发前端vue页面,踩到了一个坑,这个坑不大不小的,但是对于我这种除非公司需要,否则不会主动学习前端技术的后端开发者来说,这个坑困扰了我半天时间。无论怎么修改代码,还是实现不了效果,归根结底还是没有找到问题的点所在。凡事都有好的一面,今天上午脑子就开了光,思路比昨天下午清晰多了,顺着思路,我终于发现了问题的点所在,然后百度一搜,果然是这样,嗨!于是我决定总结一番!大家都知道,vu

    2022年10月18日
    7
  • 最长回文子串问题-Manacher算法【建议收藏】

    最长回文子串问题-Manacher算法【建议收藏】前面我们讲过一个关于字符串的算法 KMP 算法 今天我们来讲另外一个字符串算法 Manacher 算法 这个算法是用于解决一个问题叫 最长回文子串 前期文章 KMP 算法牛客网 OJ 链接说的简单一点 给定一个字符串 返回的值是这个字符串的最长回文子串的长度 顾名思义 即是回文串 也是子串 文章目录一 BF 算法二 Manacher 算法一 BF 算法那上图的示例 2 为例 abcab 最简单的思路就是从左到右遍历每一个字符 每来到一个字符位置 我们可以向左右两边进行扩展 分别比较左右两边的字符

    2026年3月17日
    3
  • 《Python游戏编程入门》第二章编程挑战

    《Python游戏编程入门》第二章编程挑战转眼间就到六月份啦 隔一段时间就来写写博客来总结一下这段时间自己所学的东西 近期还是在学 Python Python 真是一门神奇的语言 你越用越喜欢 哈哈哈 近期在学校图书馆看到了一本叫 Python 游戏编程入门 的书 作者是 JonathanS Harbour 在图书馆稍微看了一下 发现还是蛮有趣的 所以就果断借走了 嘻嘻嘻 第一章是简单的介绍了 Python 的面向对象编程 不是很有意思就略过啦 第

    2026年3月16日
    1
  • LCD12864示例子程序

    LCD12864示例子程序总结一下一些模块常用的子程序相信很多同学和我一样 刚开始的时候可能不太喜欢拿着数据手册去看 然后去写一些子程序 比如说 lcd12864 或者 lcd1602 的一些写命令 写数据 忙检查子程序等等 这里给大家总结一些模块的子程序 大家直接可以复制粘贴拿来用 LCD12864 模块下面是实际使用 lcd12864 模块的子程序 当然如果大家买的模块带中文字库 可以直接查找字库表显示中文汉字 或者直接将中文字符串进行输出显示

    2026年3月26日
    2
  • php new reflectionclass,PHP: ReflectionClass – Manual

    php new reflectionclass,PHP: ReflectionClass – ManualReflectionClass::__construct—СоздаётобъектклассаReflectionClassReflectionClass::getConstant—ВозвращаетопределённуюконстантуReflectionClass::getConstructor—ВозвращаетконструкторклассаRefle…

    2025年8月12日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号