简体   繁体   中英

download file from server failed

Now I am trying to download a file from the server which use 302 redirect the get request to the download resourse.Well when I use my code below to download file the server reponse with failed I think the server knows I don`t use brower to download file.When I use browser it works fine and the file is right.

Can you tell me where is the problem in my code.thanks.

this is my code:

@SuppressWarnings("deprecation")
public static void downloadFile(String url, String fileName, String page) throws InterruptedException, IOException {

    httpClient = new DefaultHttpClient(cm);


    // set timeout
    HttpParams httpParams = httpClient.getParams();
    HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_SECONDS * 1000);

    HttpEntity entity = null;
    HttpGet httpGet = new HttpGet(url);
    Random r=new java.util.Random(UAS.length); 
    //Cookie:AJSTAT_ok_times=7
    String ua = UAS[r.nextInt(UAS.length)];

    httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 AlexaToolbar/alxg-3.1");
    httpGet.setHeader("Accept-Charset", "UTF-8,utf-8;q=0.7,*;q=0.3");
    httpGet.setHeader("Accept-Encoding", "deflate,sdch");
    httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
    httpGet.setHeader("Cache-Control", "max-age=0");
    httpGet.setHeader("Connection", "keep-alive");
    httpGet.setHeader("Cookie", "AJSTAT_ok_times=7");
    httpGet.setHeader("Host", "www.test.com");
    httpGet.setHeader("Cookie", "AJSTAT_ok_times=7");


    try {
        HttpContext context = new BasicHttpContext();

        HttpResponse remoteResponse = httpClient.execute(httpGet, context);
        entity = remoteResponse.getEntity();
        if (remoteResponse.getStatusLine().getStatusCode() != 200) {
            System.out.println(remoteResponse.getStatusLine().getStatusCode());
        }
    } catch (Exception e) {
        httpGet.abort();
        e.printStackTrace();
        return;
    }

    // 404返回
    if (entity == null) {
        System.out.println("404");
        return;
    }

    File file = new File(fileOutPutDIR + page + "/" + fileName + ".rar");

    File parent = file.getParentFile();
    if (parent.exists() || parent.mkdirs()) {
        // ...
    } else {
        throw new IOException("Failed to create output directory " + parent);
    }

    System.out.println("downloading..." + file.getName());

    InputStream input = entity.getContent();

    try {
        FileUtils.copyInputStreamToFile(input, file);
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        IOUtils.closeQuietly(input);
    }

}

pom:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.2.3</version>
</dependency>

Please have a look at the http documentation http://hc.apache.org/httpclient-legacy/redirects.html I think you need to handle redirection manually

Handling redirects manually

All response codes between 300 and 399 inclusive are redirect responses of some form. The most common redirect response codes are:

301 Moved Permanently. HttpStatus.SC_MOVED_PERMANENTLY
302 Moved Temporarily. HttpStatus.SC_MOVED_TEMPORARILY
303 See Other. HttpStatus.SC_SEE_OTHER
307 Temporary Redirect. HttpStatus.SC_TEMPORARY_REDIRECT

Note: there are a number of response codes in the 3xx range which do not simply indicate a different URI to send the request to. These response codes are listed below and the manner they are handled will be application specific.

When your application receives one of the "simple" redirect responses, it should extract the new URL from the HttpMethod object and retry downloading from that URL. Additionally, it is usually a good idea to limit the number of redirects that will be followed in case the redirects form a recursive loop.

The URL to connect to can be extracted from the Location header.

    String redirectLocation;
    Header locationHeader = method.getResponseHeader("location");
    if (locationHeader != null) {
        redirectLocation = locationHeader.getValue();
    } else {
        // The response is invalid and did not provide the new location for
        // the resource.  Report an error or possibly handle the response
        // like a 404 Not Found error.
    }

Once you have determined the new location, you can reattempt the connection as normal. See the Tutorial for more information on this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM