0

现在我正在尝试从使用 302 将获取请求重定向到下载资源的服务器下载文件。好吧,当我使用下面的代码下载文件时,服务器响应失败,我认为服务器知道我不使用浏览器下载文件。当我使用浏览器时,它工作正常并且文件是正确的。

你能告诉我代码中的问题在哪里吗?谢谢。

这是我的代码:

@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);
    }

}

起居室:

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

1 回答 1

0

请查看 http 文档 http://hc.apache.org/httpclient-legacy/redirects.html 我认为您需要手动处理重定向

手动处理重定向

300 到 399 之间的所有响应代码都是某种形式的重定向响应。最常见的重定向响应代码是:

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

注意:在 3xx 范围内有许多响应代码,它们不仅仅表示将请求发送到的不同 URI。下面列出了这些响应代码,它们的处理方式将是特定于应用程序的。

当您的应用程序收到“简单”重定向响应之一时,它应该从 HttpMethod 对象中提取新 URL,然后从该 URL 重试下载。此外,如果重定向形成递归循环,限制将遵循的重定向数量通常是一个好主意。

要连接的 URL 可以从 Location 标头中提取。

    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.
    }

确定新位置后,您可以像往常一样重新尝试连接。有关这方面的更多信息,请参阅教程。

于 2013-04-17T02:49:30.310 回答