2016-09-29 84 views
0

我目前正在编写一个上传文件到服务器的函数。 我的文件名格式是典型的像这样的行为#USERNAME.TXT,我遇到了错误URLConnection.guessContentTypeFromName错误(Java)

java.lang.StringIndexOutOfBoundsException:length = 41; regionStart = 38; regionLength = -28

当这行代码

writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED); 

我做了一些调试,实现了问题是由字符“#”引起的。拿出来允许文件上传。实际的文件允许#字符,所以我不明白为什么会导致StringIndexOutOfBoundsException。

请问有谁能够赐教吗?

+0

适用于我:https://ideone.com/sEXYso您可以提供完整的堆栈跟踪吗? – 2016-09-29 17:26:58

+0

@RC。这是行不通的。它应该返回“text/plain”,或者说,这是OP所期望的。如果你把'#'改成'%23',那就是你会得到的。 – Andreas

+0

@Andreas是的[mcve]赢得了 – 2016-09-29 18:53:22

回答

2

#符号在URL中有特殊含义。

URL的#fragment部分(请参阅syntax)永远不会从客户端发送到服务器。它是由客户端处理的URL的一部分。它可以通过链接和重定向从服务器发送到客户端。

要在文件名中包含#符号(或任何其他特殊字符),必须使用%NN十六进制代码对其进行转义/编码。

#的编码是%23,但您确实应该使用URL编码器。

+0

感谢您的简单和简洁的答案。 URLEncoder.encode(fileName,“UTF-8”);诀窍。谢谢! – user4094170