用Java下载PDF是否已损坏?

我已经阅读了关于如何使用Java从Internet下载和保存文件的优秀讨论。 但是,如果我执行下一个代码,我会得到一个损坏的PDF。 知道为什么吗?

import java.io.*; import java.net.*; public class PDFDownload { public static String URL = "http://www.nbc.com/Heroes/novels/downloads/"; public static String FOLDER = "C:/Users/sdelamo/workspace/SandBox/HeroesNovel/"; public static void main(String[] args) { String filename = "Heroes_novel_001.pdf"; try { saveUrl(FOLDER + filename, URL + filename); } catch (MalformedURLException e) { System.out.println("MalformedURLException"); } catch (IOException e) { System.out.println("IOException"); } } public static void saveUrl(String filename, String urlString) throws MalformedURLException, IOException { BufferedInputStream in = null; FileOutputStream fout = null; try { URL url = new URL(urlString); in = new BufferedInputStream(url.openStream()); fout = new FileOutputStream(filename); byte data[] = new byte[1024]; int count; while ((count = in.read(data, 0, 1024)) != -1) { fout.write(data, 0, count); } } finally { if (in != null) in.close(); if (fout != null) fout.close(); } } } 

上面的代码下载html而不是PDF。 这是输出:

            NBC.com: Heroes      

NBC : logo

Heroes : showheader

Mondays 9/8c
<!--Mondays 8/7c-->

FEATURED CONTENT

featured Dreams Heroes premieres Mon., Sept. 21s...
featured Recap: Season 3 Episode An Invisible Thread
featured Photo: Heroes "Cast Photos"

HEROES

About
Videos
Episode Recaps
Photos
Community
Shows List
<!-- -->
© NBC Universal, Inc.

知道如何下载PDF吗?

连接前设置User-Agent。

 URL u = new URL(urlString); HttpURLConnection huc = (HttpURLConnection) u.openConnection(); huc.setRequestMethod("GET"); huc.setRequestProperty("User-Agent", " Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); huc.connect(); in = new BufferedInputStream(huc.getInputStream()); 

这与您的其他问题是同一个问题。 如果它认为你是刮刀,NBC.com不会向你发回PDF 🙂

同样的技巧会做,

 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13"); 

您是否尝试使用文本编辑器查看下载的文件?

您会看到它包含HTML页面,而不是PDF。 可能URL不指向PDF,或者有一些重定向,标准java.net类默认不支持。

确保URL正确指向PDF。 您可以使用Apache HttpClient通过HTTP执行更复杂的操作,包括自动处理HTTP重定向。

注意:您发布的代码无法编译,因为您错误地放置了}

检查生成的文件 – 我希望它是一个HTML文件。 如果没有引用者或使用JavaScript重定向页面或其他内容,该站点可能会返回错误。 您可以使用HttpURLConnection类检查服务器返回的HTTP标头。

 URL url = new URL( "http://www.nbc.com/Heroes/novels/downloads/Heroes_novel_001.pdf"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("HEAD"); try { for (Map.Entry> header : conn.getHeaderFields() .entrySet()) { System.out.println(header.getKey() + "=" + header.getValue()); } } finally { conn.disconnect(); } 

上面的代码返回text/htmlContent-Type

对于这种探索,我强烈推荐Jython (或Groovy,或……)。 例如:

 C:\用户\维奈>的jython
 Jython 2.5.0(Release_2_5_0:6476,2009年6月16日,13:33:26)
 [Java HotSpot(TM)客户端VM(Sun Microsystems Inc.)],java1.6.0_16
输入“帮助”,“版权”,“信用”或“许可”以获取更多信息。
 >>> s =“http://www.nbc.com/Heroes/novels/downloads/Heroes_novel_001.pdf”
 >>> import java.net
 >>>导入jarray
 >>> u = java.net.URL(s)
 >>> os = u.openStream()
 >>> buffer = jarray.zeros(1024,'b')
 >>> n = os.read(缓冲区,0,1024)
 >>> java.lang.String(buffer)
           meta http-equiv="refresh" content="200"> NBC.com: Heroes     

版画

%PDF

所以该网站正在查看User-Agent标头。

如果设置User-Agent没有解决它。 这可能是Cookies的一个问题。 安装简单的浏览器插件(EditThisCookie,用于Chrome的HTTP Spy)并检查请求和响应标头。 抓取这些cookie值并使用相同的HttpURLConnection设置它们。

代码:(扩展到Sergio del Amo发布的解决方案)

 URL u = new URL(urlString); HttpURLConnection huc = (HttpURLConnection) u.openConnection(); huc.setRequestMethod("GET"); huc.setRequestProperty("User-Agent", " Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); String myCookies = "cookie_name_1=cookie_value_1;cokoie_name_2=cookie_value_2"; huc.setRequestProperty("Cookie", myCookies); huc.connect(); in = new BufferedInputStream(huc.getInputStream());