如果文件是特定內容類型,我正嘗試從URL下載文件。該URL可以提供html或pdf頁面,我只想保存pdf文件。我在做此嘗試以下:如何在確認內容類型後將URL保存到文件中?
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
String contentType = connection.getContentType();
if (contentType.equals("application/pdf")) {
org.apache.commons.io.FileUtils.copyURLToFile(url, file);
}
將contentType正確是牽強,但在以下異常調用copyURLToFile(url,file);
結果:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:999)
at org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:848)
如果我刪除的代碼行用於獲取的contentType,只需撥打copyURLToFile(url,file)
,即可下載並保存文件。我是否以某種方式錯誤地處理了我的HttpURLConnection
,導致我的連接重置?
我也注意到,如果我在if(contentType.equals("application/pdf")
行上設置了一個斷點並等待幾秒鐘,那麼對copyURLToFile
的調用將成功,而不會重置連接。我是否會引入某種總是失敗的競爭條件?
你獲取內容類型之後就重新連接或connection.setReadTimeOut –
我認爲[主治]玩(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4)不應該返回你的文件的內容。 – ShyJ
對'copyURLToFile'的調用會創建一個新連接,所以它不應該使用HEAD請求從URL獲取輸入流。 –