无法使用“发布到URL”;java.lang.IllegalArgumentException:路径中的非法字符;

无法使用“发布到URL”;java.lang.IllegalArgumentException:路径中的非法字符;,java,android,url,Java,Android,Url,这是我的网址 String serverUrl = http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/Universal Image Loader @#&=+-_.,!()~'%20.png 这里是universalimageloader@#&=+-。,!()~'%20.png只是动态指定给字符串的文件名 HttpPost httpPost = new HttpPost(serverUrl); 我得到

这是我的网址

String serverUrl = http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/Universal Image Loader @#&=+-_.,!()~'%20.png
这里是
universalimageloader@#&=+-。,!()~'%20.png
只是动态指定给字符串的文件名

HttpPost httpPost = new HttpPost(serverUrl);
我得到:

java.lang.IllegalArgumentException:索引76处路径中的非法字符:http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/Universal 图像加载器@#&=+-\。,!()~'%20.png


补救措施是什么?

您应该对字符串进行URL编码

String encoded = URLEncoder.encode (
    "http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/Universal Image Loader @#&=+-_.,!()~'%20.png",
    "UTF-8");
HttpPost httpPost = new HttpPost(encoded);

编辑,正如Duncan正确评论的那样,如果您的URL包含一个查询字符串,其中包含字符
&
,则您不希望对这些字符进行URL编码。您只能对包含问题字符的字符串进行编码。

您应该对字符串进行URL编码

String encoded = URLEncoder.encode (
    "http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/Universal Image Loader @#&=+-_.,!()~'%20.png",
    "UTF-8");
HttpPost httpPost = new HttpPost(encoded);

编辑,正如Duncan正确评论的那样,如果您的URL包含一个查询字符串,其中包含字符
&
,则您不希望对这些字符进行URL编码。您只能对包含有问题字符的字符串进行编码。

根据上述建议,我的代码使用了以下解决方案

String fileName = f.getName();
            try {
                fileName = URLEncoder.encode(fileName,"UTF-8");
            } catch (UnsupportedEncodingException e1) {             
                e1.printStackTrace();
            }
            String serverUrl = http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/+fileName;

根据以上建议,我的代码使用以下解决方案

String fileName = f.getName();
            try {
                fileName = URLEncoder.encode(fileName,"UTF-8");
            } catch (UnsupportedEncodingException e1) {             
                e1.printStackTrace();
            }
            String serverUrl = http://mob.krill.order-line.co.uk/MobileService.svc/UploadFile/721/+fileName;

大多数情况下,编码应该只在URL的“不可靠”部分进行。在这种情况下,您的方法会起作用,但如果在适当的时候使用查询字符串,则不会起作用。最好拆分URL,只标识
universalimageloader@#&=+-。,!()~'%20.png
部分。@邓肯谢谢你的评论@邓肯:谢谢你的建议!通过您的评论找到解决方案!大多数情况下,编码应该只在URL的“不可靠”部分进行。在这种情况下,您的方法会起作用,但如果在适当的时候使用查询字符串,则不会起作用。最好拆分URL,只标识
universalimageloader@#&=+-。,!()~'%20.png
部分。@邓肯谢谢你的评论@邓肯:谢谢你的建议!通过您的评论找到解决方案!请参阅:。使用转义序列请参阅:。使用转义序列