2013-04-17 374 views
0

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

你能告诉我在我的code.thanks问题在哪里。

这是我的代码:

@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> 

回答

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。

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

确定新的位置后,您可以像正常一样重新尝试连接。有关详细信息,请参阅教程。

+0

是的服务器使用302重定向我的请求,我认为问题发生在第二个request.but我不知道如何解决这个问题,我会读这个教程谢谢。 – Felix

+0

我认为httpclient不会自动重定向请求(不像浏览器)。文档建议您需要获取重定向位置并提出另一个请求。 (我认为:)) –

+0

httpClient.execute我只调用这个方法一次):httplient3.x与httpclient4.x是不同的? – Felix