0

一些 PHP 站点使用页面作为处理文件下载的中间人。

使用浏览器可以透明地工作。php 页面处理请求时似乎有一个轻微的停顿。

但是,尝试使用URL或通过 Java 进行下载HttpURLConnection会返回纯 html 页面。我怎样才能让文件下载以相同的方式工作?

编辑:这是一个示例链接:

http://depot.eice.be/index.php?annee_g=jour&cours=poo

编辑:这是我一直在测试的一些代码:

// This returns an HTML page

private void downloadURL(String theURL) {
    URL url;
    InputStream is = null;
    DataInputStream dis;
    String s;
    StringBuffer sb = new StringBuffer();

    try {
        url = new URL(theURL);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("GET");
        conn.connect();

        if (conn.getResponseCode()!=HttpURLConnection.HTTP_OK)
            return;


        InputStream in = conn.getInputStream();

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        int i;
        while ((i = in.read()) != -1) {
            bos.write(i);
        }

        byte[] b = bos.toByteArray();

        FileOutputStream fos = new FileOutputStream( getNameFromUrl( theURL ) );
        fos.write(b);
        fos.close();
        conn.disconnect();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

// This will throw Exceptions if the URL isn't in the expected format

public String getNameFromUrl(String url) {

    int slashIndex = url.lastIndexOf('/');
    int dotIndex = url.lastIndexOf('.');

    System.out.println("url:" + url + "," + slashIndex + "," + dotIndex);

    if (dotIndex == -1) {
        return url.substring(slashIndex + 1);
    } else {
        try {
            return url.substring(slashIndex + 1, url.length());
        } catch (StringIndexOutOfBoundsException e) {
            return "";

        }
    }
}
4

3 回答 3

2

考虑到没有其他约束,您可以从 HTTP 标头读取重定向的 URL,并直接从 JAVA 连接到该 URL。

于 2012-04-23T19:08:38.213 回答
2

有一个 API 设置可以自动跟踪重定向——但默认情况下应该是 true。您如何访问 URL?

请参阅Java API 文档...

于 2012-04-23T19:16:14.907 回答
0

我想我已经找到了使用 HttpUnit 的解决方案。如果您希望了解如何处理,可以使用该框架的源代码。

public void downloadURL(String url) throws IOException {

    WebConversation wc = new WebConversation();
    WebResponse indexResp = wc.getResource(new GetMethodWebRequest(url));
    WebLink[] links = new WebLink[1];
    try {
        links = indexResp.getLinks();
    } catch (SAXException ex) {
        // Log
    }

    for (WebLink link : links) {
        try {
            link.click();
        } catch (SAXException ex) {
            // Log
        }
        WebResponse resp = wc.getCurrentPage();
        String fileName = resp.getURL().getFile();
        fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
        System.out.println("filename:" + fileName);
        File file = new File(fileName);
        BufferedInputStream bis = new BufferedInputStream(
                resp.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(file.getName()));
        int i;
        while ((i = bis.read()) != -1) {
            bos.write(i);
        }
        bis.close();
        bos.close();
    }
    System.out.println("Done downloading.");
}
于 2012-04-25T12:31:50.873 回答