Как использовать библиотеки HttpClient для загрузки файла с Google Диска?

Я пытаюсь интегрировать Google Picker на страницу. Пользователь использует средство выбора для входа в свою учетную запись Google и выбирает файл. Я пытаюсь использовать библиотеки Apache HttpClient для загрузки этого файла.

Вот детали реализации:

Я использовал аутентификацию на стороне клиента для Javascript, как указано в этом учебнике Google. Получив 'fileId' файла, я выполнил аутентифицированный GET с помощью API Google Диска для получения метаданных файла — имени, пользователя, дат, URL-адреса загрузки, ссылок экспорта и т. д. Вы можете использовать указанную выше ссылку для проверки конечной точки и просмотра ответов, если у вас есть идентификатор файла.

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

Однако, когда я использую приведенный выше фрагмент для выполнения HttpGet для URL-адреса, входящие данные имеют тип содержимого 'text/html' . Никакого понятия об этом поведении. Я не думаю, что конечный URL-адрес нужно обрабатывать по-другому, чтобы загрузить файл.

Кто-нибудь сталкивался с этой проблемой? Заранее спасибо.


person Ashok    schedule 13.08.2013    source источник


Ответы (1)


Мне удалось решить проблему, добавив заголовок аутентификации. Я предполагаю, что токен авторизации хранится в сеансе пользователя в браузере, и поэтому я смог загрузить файл, нажав 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());
        }
    }
}
person Ashok    schedule 14.08.2013
comment
Как загрузить библиотеки HttpClient для загрузки файла с Google Диска в Objective c. Если есть какие-либо идеи, пожалуйста, ответьте. - person ChenSmile; 04.10.2013