以编程方式下载通过PHP页面推送的文件

时间:2012-04-23 19:00:34

标签: java download redirect

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

使用浏览器,这是透明的。当php页面处理请求时,似乎有一点暂停。

但是,尝试使用URLHttpURLConnection通过Java下载会返回一个简单的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 "";

        }
    }
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

Java API docs ...

答案 2 :(得分: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.");
}