2012-08-08 3 views
2

Google 드라이브에 텍스트 파일의 메타 데이터를 다운로드 할 수 있지만 XMLHttpRequest (XMLHttpRequest.status = 0)를 통해 webContentLink에 액세스 할 수 없습니다. 동일한 webContentLink URL로 window.open (url)을 호출해도 문제가 없습니다. CORS가 webContentLink에 대해 활성화되어 있지 않은 것 같습니다.google 드라이브 : javacript를 통해 webContentLink에 액세스

var clientId = '00000000000000'; 
var apiKey = 'AAAAAAAAAAAAAAAAAA'; 
var scopes = 'https://www.googleapis.com/auth/drive'; 

function loadDoc(url) { 
    //window.open(url); 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    xmlhttp.onreadystatechange = function() { 
     alert("readyState = " + xmlhttp.readyState + " status = " + xmlhttp.status); 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      //... do something 
     } 
    } 
    xmlhttp.open("GET", url, true); 
    var myToken = gapi.auth.getToken(); 
    xmlhttp.setRequestHeader("Referer", "http://mydomain"); 
    xmlhttp.setRequestHeader("Accept", "text/x-tex"); 
    xmlhttp.setRequestHeader("Content-Type", "text/x-tex"); 
    xmlhttp.responseType = 'arraybuffer'; 
    xmlhttp.overrideMimeType("text/plain"); 
    xmlhttp.setRequestHeader('Authorization', 'Bearer ' + myToken.access_token); 
    xmlhttp.send(); 
} 

function loadMetaData(url) { 
    xmlhttp = new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      var metaData = xmlhttp.responseText; 
      var index = metaData.search('"webContentLink"'); 
      if (index != -1) { 
       var i1 = metaData.indexOf('"', index + 17); 
       var i2 = metaData.indexOf('"', i1 + 1); 
       var fileName = metaData.slice(i1 + 1, i2); 
       loadDoc(fileName); 
      } 
     } 
    } 
    xmlhttp.open("GET", url, true); 
    var myToken = gapi.auth.getToken(); 
    xmlhttp.setRequestHeader('Authorization', 'Bearer ' + myToken.access_token); 
    xmlhttp.send(); 
} 

// A simple callback implementation. 
function pickerCallback(data) { 
    if (data.action == google.picker.Action.PICKED) { 
     var fileId = data.docs[0].id; 
     var url = 'https://www.googleapis.com/drive/v2/files/' + fileId; 
     loadMetaData(url); 
    } 
} 

그래서, 기능 loadMetaData (URL)가 잘 작동 및 기능 loadDoc (URL)를하지 않습니다. 이것이 CORS가 webContentLink 용으로 설정되지 않았기 때문이며 향후 변경 될 수 있습니다.

감사합니다, 대니

답변

3

편집 : Google API가 변경되어 현재 추가 된 oauthToken이 필요합니다.

해결! Alain에게 감사드립니다. 아래에서 올바른 코드를 찾을 수 있습니다. 작업 예제는 here입니다.

var clientId = '1234567890'; 
var scopes = 'https://www.googleapis.com/auth/drive'; 
var oauthToken; 

function getData(url, callback) { 
    xmlhttp = new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
      callback(xmlhttp.responseText); 
     } 
    } 
    xmlhttp.open('GET', url, true); 
    var myToken = gapi.auth.getToken(); 
    xmlhttp.setRequestHeader('Authorization', 'Bearer ' + myToken.access_token); 
    xmlhttp.send(); 
} 

// Create and render a Picker object 
function createPicker() { 
    var picker = new google.picker.PickerBuilder() 
     .setAppId(clientId) 
     .setOAuthToken(oauthToken) 
     .addView(google.picker.ViewId.DOCS) 
     .setCallback(pickerCallback) 
     .build(); 
    picker.setVisible(true); 
} 

// A simple callback implementation. 
function pickerCallback(data) { 
    if (data.action == google.picker.Action.PICKED) { 
     var fileId = data.docs[0].id; 
     var url = 'https://www.googleapis.com/drive/v2/files/' + fileId; 
     getData(url, function(responseText) { 
      var metaData = JSON.parse(responseText); 
      getData(metaData.downloadUrl, function(text) { 
       //Do something with text... 
      }); 
     }); 
    } 
} 
4

XHR을 통해 파일을 다운로드, 당신은 대신 downloadUrl을 사용하고 당신이 이미하고있는대로 Authorization 헤더로 액세스 토큰을 제공해야합니다.

webContentLink은 쿠키 인증 만 지원하며 XHR에서 검색 할 때 실패 할 수 있습니다.

+0

이 또한 작동하지 않지만 (XMLHttpRequest.status = 0), 이제 window.open (url)도 빈 창이 생성됩니다. –

+0

'loadMetaData'에 사용하는 것과 동일한 XHR 로직을 사용했지만 'downloadUrl'로 시도해 보셨습니까? 또한, 문자열 조작을 사용하여 속성을 검색하는 대신 JSON 객체를 JS 객체로 파싱하는 'JSON.parse (metaData)'를 사용해야합니다. – Alain

+0

이것은 실제로 문제를 해결했습니다. 고마워, 알랭. 같은 문제를 겪고있는 누군가를 위해 아래에 작업 코드를 게시 할 것입니다. –

관련 문제