如何使用HttpClient库从Google云端硬盘下载文件?

时间:2013-08-13 18:00:29

标签: google-drive-api apache-httpclient-4.x apache-commons-httpclient

我正在尝试在页面上集成Google Picker。用户使用选择器登录其Google帐户并选择文件。我正在尝试使用Apache HttpClient库来下载此文件。

以下是实施细节:

我在J Google Tutorial上突出显示了Javascript上的Client Side Auth。获得文件的'fileId'后,我使用Google Drive API执行经过身份验证的GET来检索文件元数据 - 名称,用户,日期,downloadUrl,exportLinks等。您可以使用上面的链接来测试结束点,如果您有fileId,请查看回复。

   
   function postDownload (resp) {
        var link;
        var data = $.parseJSON (resp);
        console.log (data.webContentLink);
        if (data.mimeType == "application/pdf"){
            link = data.downloadUrl;
        } else {
            link = (data.exportLinks)['application/pdf'];
        }
        //I wish to use the below link to download the file on server side
        //using HttpClient libraries.
        console.log ("Download Link - " +link);
    }

    //Call back after a file is selected on the picker
    function pickerCallback(data) {
        if (data.action == google.picker.Action.PICKED) {
            var id = data.docs[0].id;
            var accessToken = gapi.auth.getToken().access_token;
            console.log (id);

            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'https://www.googleapis.com/drive/v2/files/' + id);
            xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
            xhr.onload = function() {
                postDownload(xhr.responseText);
            };
            xhr.onerror = function() {
                checkAuth();
            };
            xhr.send();
        }
    }

下载代码:

    import java.io.IOException;
    import org.apache.http.Header;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;

    public class DownloadFile {

    public static void main(String[] args) throws IOException {
        String link = "https://docs.google.com/uc? id=0ByJwoNOQMrO_S3hlWGRfa2JwVWM&export=download";

        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpGet get = new HttpGet(link);
        HttpResponse response = httpclient.execute(get);

        Header[] headers = response.getAllHeaders();
        for (Header header : headers) {
            System.out.println("Key : " + header.getName() + " ,Value : " + header.getValue());
        }
    }

}

如果我使用浏览器或POSTMAN Chrome扩展程序上的链接,我可以正确下载文件。 REST客户端将传入的数据正确报告为“application / pdf”。

但是,当我使用上面的Snippet在URL上执行HttpGet时,传入的数据的内容类型为“text / html”。没有关于这种行为的线索。我不认为最终的URL需要以不同的方式处理以下载文件。

有人遇到过这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我能够通过添加身份验证标头来解决问题。我想auth令牌存储在浏览器的用户会话中,因此我可以通过点击URL来下载文件。对于独立的Java程序,我们可能也必须传递身份验证令牌。

以下代码有效。

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class DownloadFile {

    public static void main(String[] args) throws IOException {
        String link = "https://docs.google.com/feeds/download/documents/export/Export?id=1vE4GVvVVipwMjKsc1q9p75LYWrRy8DZz0APjVFiHL9A";

        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpGet get = new HttpGet(link);
        // get.addHeader("Content-Type", "application/pdf");
        get.addHeader("Authorization", "Bearer 1vE4GVvVVipwMjKsc1q9p75LYWrRy8DZz0APjVFiHL9A");
        HttpResponse response = httpclient.execute(get);

        Header[] headers = response.getAllHeaders();
        for (Header header : headers) {
            System.out.println("Key : " + header.getName() + " ,Value : " + header.getValue());
        }
    }
}
相关问题