获取URL.openConnection()之后的重定向地址;

时间:2013-08-17 05:11:51

标签: android facebook-graph-api caching

首先,如果有人提出这个问题,我想道歉,我一直在谷歌搜索,但没有找到任何解决方案。

网址A:http://graph.facebook.com/1787989776/picture

网址B:http://profile.ak.fbcdn.net/hprofile-ak-ash3/49968_1787989776_350012849_q.jpg

简而言之:我想在访问网址A 后,使用文件名作为网址重定向来缓存我的照片,而不是网址A 。< / p>

详细说明:

我们总是缓存下载的图片。在我的情况下,我想缓存Facebook个人资料的照片。例如:从网址A 下载的图片。

点击该链接即可看到,我们正被重定向到网址B

使用网址A 缓存我的照片并不安全,因为下次调用时图片可能已更改(用户更改了他的个人资料照片,但Facebook通过维护图表网址来简化我们的工作),虽然我的图像加载器不会获取任何新图像,因为条件“图像在缓存中找到”给了我真实,确定它确实如此。

所以,如果我能获得网址B 并使用它来缓存我的照片,那就太好了。

我相信描述已经足够了,但如果你想知道我在这里做了什么,那就是:

URL url = new URL(imgUrl); // imgUrl = URL A
URLConnection connection = url.openConnection();
connection.connect();

InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(downloadedFile); // downloadedFile = File named with encoded URL A

byte data[] = new byte[10240]; // 10kb
int count;
while ((count = input.read(data)) != -1) {
    output.write(data, 0, count);
}

output.flush();
output.close();
input.close();

2 个答案:

答案 0 :(得分:0)

如果切换到HttpClient,可以使用client.setRedirectHandler()设置RedirectHandler,这样您就可以获得URL A重定向到的URL B.

答案 1 :(得分:0)

        url = "http://graph.facebook.com/" + params[0] + "/picture?type=large";
        URL obj = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
        conn.setReadTimeout(5000);
        conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
        conn.addRequestProperty("User-Agent", "Mozilla");
        conn.addRequestProperty("Referer", "google.com");
        System.out.println("Request URL ... " + url);

        int status = conn.getResponseCode();
        if (status != HttpURLConnection.HTTP_OK) {
        if (status == HttpURLConnection.HTTP_MOVED_TEMP 
                   || status == HttpURLConnection.HTTP_MOVED_PERM
                   || status == HttpURLConnection.HTTP_SEE_OTHER) {
              String URL2 = conn.getHeaderField("Location");                                  
        }
   }