【问题标题】:Downloading HTML instead of File下载 HTML 而不是文件
【发布时间】: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


【解决方案1】:

我认为目标 url 执行一些 javascript 来提供文件。该脚本必须由某些 javascript 引擎解释(和执行)。

因此,您需要一些分辨率来获取真实的文件 url(而不仅仅是 javascript),或者集成一些 javascript 引擎来执行脚本代码并获得结果。

我认为这可以帮助你:Executing javascript in java - Opening a URL and getting links

或更好:

http://www.java2s.com/Code/Java/JDK-6/ExecuteJavascriptscriptinafile.htm

【讨论】:

  • 你将如何使用它来解决下载正确文件的问题?
  • 也许我的链接具有误导性,抱歉。我认为脚本 enigne 会起作用,但这仅用于执行您提供的脚本。在这种情况下,我认为很难实现您想要的,因为您的提供商阻止了访问。请参阅@Matt 对您的问题的评论。
【解决方案2】:

我将网站主机切换到this one,现在上面的代码可以正常工作。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 抱歉,两者都存在,但使用 https 会抛出 SSLHandshakeException
    • 是的,对不起,你是对的。您有 aes.js 拦截请求并放置 URL 参数并获取页面。这不是一个简单的下载。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多