开发者

Java URL problem

开发者 https://www.devze.com 2023-03-26 08:02 出处:网络
A webpage contains a link to an executable (i.e. If we click on the link, the browser will download the file on your local machine).

A webpage contains a link to an executable (i.e. If we click on the link, the browser will download the file on your local machine).

Is there any way to achieve the same functionality with Java?

Than开发者_如何学JAVAk you


Yes there is. Here a simple example:

You can have a JSF(Java Server Faces) page, with a supporting backing bean that contains a method annotated with @PostConstruct This means that any action(for example downloading), will occur when the page is created.

There is already a question very similar already, have a look at: Invoke JSF managed bean action on page load


You can use Java's, URL class to download a file, but it requires a little work. You will need to do the following:

  1. Create the URL object point at the file
  2. Call openStream() to get an InputStream
  3. Open the file you want to write to (a FileOutputStream)
  4. Read from the InputStream and write to the file, until there is no more data left to read
  5. Close the input and output streams

It doesn't really matter what type of file you are downloading (the fact that it's an executable file is irrelevant) since the process is the same for any type of file.

Update: It sounds like what you actually want is to plug the URL of a webpage into the Java app, and have the Java app find the link in the page and then download that link. If that is the case, the wording of your question is very unclear, but here are the basic steps I would use:

  1. First, use steps 1 and 2 above to get an InputStream for the page
  2. Use something like TagSoup or jsoup to parse the HTML
  3. Find the <a> element that you want and extract its href attribute to get the URL of the file you need to download (if it's a relative URL instead of absolute, you will need to resolve that URL against the URL of the original page)
  4. Use the steps above to download that URL

Here's a slight shortcut, based on jsoup (which I've never used before, I'm just writing this from snippets stolen from their webpage). I've left out a lot of error checking, but hey, I usually charge for this:

Document doc = Jsoup.connect(pageUrl).get();
Element aElement = doc.getElementsByTag("a").first() // Obviously you may need to refine this
String newUrl = aElement.attr("abs:href"); // This is a piece of jsoup magic that ensures that the destination URL is absolute
// assert newUrl != null
URL fileUrl = new URL(newUrl);
String destPath = fileUrl.getPath();
int lastSlash = destPath.lastIndexOf('/');
if (lastSlash != -1) {
    destPath = destPath.substring(lastSlash);
}
// Assert that this is really a valid filename
// Now just download fileUrl and save it to destPath

The proper way to determine what the destination filename should be (unless you hardcode it) is actually to look for the Content-Disposition header, and look for the bit after filename=. In that case, you can't use openStream() on the URL, you will need to use openConnection() instead, to get a URLConnection. Then you can use getInputStream() to get your InputStream and getRequestProperty("Content-Disposition") to get the header to figure out your filename. In case that header is missing or malformed, you should then fall-back to using the method above to determine the destination filename.


You can do this using apache commons IO FileUtils

http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html#copyURLToFile(java.net.URL, java.io.File)

Edit:

I was able to successfully download a zip file from source forge site (it is not empty), It did some thing like this

import java.io.File;
import java.net.URL;

import org.apache.commons.io.FileUtils; 
public class Test 
{

 public static void main(String args[])
 {

    try {
        URL url = new URL("http://sourceforge.net/projects/gallery/files/gallery3/3.0.2/gallery-3.0.2.zip/download");
        FileUtils.copyURLToFile(url, new File("test.zip"));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
   }
 }

I was able successfully download tomcat.exe too

URL url = new URL("http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.exe");

0

精彩评论

暂无评论...
验证码 换一张
取 消