我正在尝试使用以下代码在此网址http://hitbullseye.com/includes/testmaster_pdffiles/CAT 2013.pdf上下载pdf文件:
URL url = new URL("http://hitbullseye.com/includes/testmaster_pdffiles/CAT%202013.pdf");
URLConnection ucon = url.openConnection();
ucon.setReadTimeout(40000);
ucon.setConnectTimeout(40000);
InputStream is = ucon.getInputStream();
它在InputStream中抛出FileNotFound异常is = ucon.getInputStream(); 我已经在我的清单中给了Internet许可。我也在下载其他文件,但这个没有下载。
我的Logcat:
06-12 15:59:50.091: E/Note:(28745): file url: http://hitbullseye.com/includes/testmaster_pdffiles/CAT%202013.pdf
06-12 15:59:50.251: D/libc(28745): [NET] getaddrinfo hn 19, servname NULL, ai_family 0+
06-12 15:59:50.251: D/libc(28745): [SMD][Mode1]: Screen on and original TTL is not expired,bl_level=131
06-12 15:59:50.251: D/libc(28745): FOUND IN CACHE entry=0x52788a30
06-12 15:59:50.541: W/System.err(28745): java.io.FileNotFoundException: http://www.hitbullseye.com/includes/testmaster_pdffiles/CAT 2013.pdf
06-12 15:59:50.551: W/System.err(28745): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
我也通过以下代码编码了网址:
URI urii;
try {
urll = new URL(downloadUrl);
urii = new URI(urll.getProtocol(), urll.getUserInfo(),
urll.getHost(), urll.getPort(), urll.getPath(),
urll.getQuery(), urll.getRef());
urll = urii.toURL();
downloadUrl = urll.toString();
} catch (Exception e1) {
e1.printStackTrace();
}
我没有发布任何重复的问题。我已经阅读了HTTP URL Address Encoding in Java,但我想这是一个不同的问题。请帮忙!甚至DownloadManager也没有下载它,返回HTTP_DATA_ERROR。
答案 0 :(得分:1)
您提供的页面似乎提供了301 - 永久移动的响应。请尝试使用HttpURLConnection。
HttpURLConnection ucon = url.openConnection();
另外,请尝试使用setInstanceFollowRedirects跟随重定向,以防重定向被禁用。
ucon.setInstanceFollowRedirects(true);
答案 1 :(得分:1)
将www.
添加到它为我工作的链接,我计算了字节,输出正好是文件的大小。
编辑:你可以看到它对我有用
URL url=null;
try {
url = new URL("http://www.hitbullseye.com/includes/
testmaster_pdffiles/CAT%202013.pdf");
} catch (MalformedURLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
URLConnection ucon=null;
try {
ucon = url.openConnection();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ucon.setReadTimeout(40000);
ucon.setConnectTimeout(40000);
try {
InputStream is = ucon.getInputStream();
DataOutputStream in2=new DataOutputStream(new FileOutputStream(new File("D:\\site\\data.pdf")));
int count=0;
int datar=is.read();
while(datar!=-1){
in2.write(datar);
count++;
datar=is.read();
}
in2.close();
System.out.println(count);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
回答你的上一条评论:我也很感兴趣,为什么它只适用于www
,我检查了whireshark,我尝试了几个链接,你在没有www
的问题中给出的链接是唯一一个回复301的链接永远移动,可能是我不确定100%的问题。我进一步观察,在301响应之后,url在空间之后被切断了
答案 2 :(得分:0)
首先尝试对url进行编码(是的,使用空格)。
URL url = new URL(URLEncoder.encode("http://hitbullseye.com/includes/testmaster_pdffiles/CAT 2013.pdf", "UTF-8"));
当然要检查MalformedURLException
try {
URL url = ....
} catch (MalformedURLException e) {
e.printStackTrace();
}
如果您的设备/测试设备上的网络允许您使用androids默认浏览器访问该文件,则仍然无法访问它。也许它是防火墙和/或dns不匹配。