【发布时间】:2016-01-19 17:14:57
【问题描述】:
我正在使用 Java 代码从 Internet 下载文件并将其保存到某个目录。
但是,代码下载的是页面的HTML源代码,而不是文件内容。
下面的代码说明了这个问题:
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
public class JavaFileDownloadTest
{
public static void download(String remoteURL, String targetFilePath)
throws IOException
{
URL downloadableFile = new URL(remoteURL);
ReadableByteChannel readableByteChannel = Channels.newChannel(downloadableFile.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(targetFilePath);
fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
}
public static void main(String[] arguments) throws IOException
{
String userHome = System.getProperty("user.home");
String fileName = "Test.txt";
String targetFilePath = userHome + File.separator + "Downloads" + File.separator + fileName;
download("http://bullywiiplaza.cuccfree.com/" + fileName, targetFilePath);
Desktop.getDesktop().open(new File(targetFilePath));
}
}
位于here 的文件包含文本
Hello StackOverflow!
但是,当使用上述代码下载时,我得到的是 HTML 源代码作为文件内容:
<html><body><script type="text/javascript" src="/aes.js" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("ae71113e4baf38cee1c1aacf0ae66c00");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; document.cookie="referrer="+escape(document.referrer); location.href="http://bullywiiplaza.cuccfree.com/Test.txt?ckattempt=1";</script><noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript></body></html>
为什么会这样,我该如何解决?我已经尝试了各种下载文件的库和方法,但它们都产生了同样的“错误”结果。
【问题讨论】:
-
选择更好的文件主机。您正在使用的那个拒绝提供文件,直到设置了一些 cookie(可能用于分析)。你看到的是他们提供给还没有 cookie 的浏览器的代码。请注意,如果您在私人浏览器中访问该链接,它会重定向(使用您看到的代码)并将
?ckattempt=1添加到末尾。 -
@Matt:我确实注意到浏览器重定向但我不知道如何处理它以编程方式下载文件
-
解决办法是:选择更好的文件主机。您选择的那个需要在交付文件之前进行分析跟踪。以编程方式下载文件意味着 Java 是您的“浏览器”,它 A) 没有您的浏览器具有的 cookie,并且 B) 无法执行 JavaScript 来创建该 cookie。只有浏览器才能满足该文件主机的要求。他们正在积极阻止 cURL(通过
403ing 它),您必须先下载依赖项(aes.js),然后才能执行他们的分析脚本。试试像 GitHub Pages 之类的更好的主机
标签: java html file url download