• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 817
  • Last Modified:

Downloading a zip-file with URLConnection

Hi, I'm trying to download a zip-file with an URLConnection. But inputStream.read(buffer)) returns always -1.If I use another address to a normal html-page, it works. See my code below.
Can anyone help?
Thanks
...
            URL url = new URL(address);
            outputStream = new BufferedOutputStream(new FileOutputStream(localFileName));
            URLConnection urlConnection = url.openConnection();
            
            inputStream = urlConnection.getInputStream();
            byte[] buffer = new byte[1024];
            int numRead;
            long numWritten = 0;
            while ((numRead = inputStream.read(buffer)) != -1)
            {
                outputStream.write(buffer, 0, numRead);
                numWritten += numRead;
            }
...

Open in new window

0
bueschi
Asked:
bueschi
  • 3
  • 2
1 Solution
 
Ajay-SinghCommented:
Are you able to download the zip page from browser? and from tools like wget, curl?
0
 
bueschiAuthor Commented:
Hi Ajay-Singh, thank you for your question. For sure, with the browser, its no problem for downloading the file.I have not installed a tool like wget or curl.
0
 
Ajay-SinghCommented:
Can you set the request property to use browser's user-agent,

urlConnection.setRequestProperty("User-Agent", "Mozilla/4.0");
0
 
bueschiAuthor Commented:
Hi Ajay-Singh, sorry, that I havent answer your question. We have new firewall sittings in our company, I tried it over vpn and we are going to solve the dowload with mule. So my problem is obsolete. Sorry and thanks
0
 
bueschiAuthor Commented:
Finally I found a solution with the help of jakarta commons http client:
public String downloadFile(final String uri,
                           final String localFilePath,
                           final LogInformation logInformation)
{
    HttpClient client = new HttpClient();
    HostConfiguration config = new HostConfiguration();
    config.setProxy(PROXY_ADDRESS, PROXY_PORT);
    Credentials defaultcreds = new UsernamePasswordCredentials(PROXY_USER, PROXY_PASSWORD);
    client.getState().setProxyCredentials(AuthScope.ANY, defaultcreds);
    client.setHostConfiguration(config);
 
    List<String> authPrefs = new ArrayList<String>(1);
    authPrefs.add(AuthPolicy.BASIC);
    // This will exclude the NTLM authentication scheme
    client.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
 
    GetMethod method = new GetMethod(uri);
    OutputStream outputStream = null;
    String fileNameWithPath = null;
    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                                    new DefaultHttpMethodRetryHandler(3, false));
 
    InputStream responseBody = null;
    try
    {
        int statusCode = client.executeMethod(method);
        if (statusCode != HttpStatus.SC_OK)
        {
            log.error(logInformation, "Method failed: " + method.getStatusLine());
        }
        responseBody = method.getResponseBodyAsStream();
        fileNameWithPath = localFilePath + extractFileName(method.getPath());
        outputStream = new BufferedOutputStream(new FileOutputStream(fileNameWithPath));
        log.info(logInformation, "write the file: '" + fileNameWithPath + "'.");
        IOUtils.copy(responseBody, outputStream);
        outputStream.close();
        responseBody.close();
    }
    catch (HttpException e)
    {
        String message = "A HttpException on downloading the shab archive: " + e.getMessage();
        log.error(logInformation, message, e);
        throw new RuntimeException(message);
    }
    catch (IOException e)
    {
        String message = "A IOException on downloading the shab archive: " + e.getMessage();
        log.error(logInformation, message, e);
        throw new RuntimeException(message);
    }
    finally
    {
        // Release the connection.
        method.releaseConnection();
    }
    return fileNameWithPath;
}
 
 
/**
 * Extracts the file name.
 *
 * @param path the path containing the name of the file.
 * @return the name of the file.
 */
private String extractFileName(String path)
{
    String[] splits = path.split("/");
    String filename = splits[splits.length - 1];
    return filename;
}

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now