2016-04-24 12 views
5

Mam problem z pobieraniem plików binarnych z Dysku przy użyciu interfejsu API, w kółko.Czytanie pliku binarnego z Dysku Google przy użyciu pliku node.js

Oto odpowiednie bity kod:

// Load client secrets from a local file. 
fs.readFile('client_secret.json', function processClientSecrets(err, content) { 
    if (err) { 
    console.log('Error loading client secret file: ' + err); 
    return; 
    } 
    // Authorize a client with the loaded credentials, then call the 
    // Drive API. 
    oauth.authorize(JSON.parse(content), dasm.init, driveapi.getFile) 
}); 

driveapi.getFile:

function getFile(auth, cb) { 
    var service = google.drive('v3'); 
    service.files.get({ 
    auth: auth, 
    pageSize: 20, 
    fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00", 
    alt: 'media' 
    }, function(err, response) { 
    if (err) { 
     console.log('The API returned an error: ' + err); 
     return; 
    } 
    cb(response) 
    }); 
} 

Teraz response wydaje się wracać jako ciąg znaków. Kiedy próbuję nawrócić się na szesnastkowy, zaczyna się szaleć. Czy istnieje sposób, aby wziąć response i dostać go do Buffer? Czy jest uszkodzony przez sekundę, którą otrzymałem od service.files.get?

nakrętkami, to znaczy, że

console.log(
     arrData[0].charCodeAt(0).toString(2), 
     '-', 
     arrData[1].charCodeAt(0).toString(2), 
     '-', 
     arrData[2].charCodeAt(0).toString(2), 
     '-', 
     arrData[3].charCodeAt(0).toString(2), 
     '-', 
     arrData[4].charCodeAt(0).toString(2) 
    ) 

= 1001101 - 1011010 - 1111111111111101 - 0 - 11 (używam binarne, aby spróbować zobaczyć, co jest zepsute)

Prawidłowe hex byłoby 4D 5A 90 00 03

Edit: dla tych, którzy są zdezorientowani, jak ja, jak 90 stał fffd jest to Unicode replacement character który zostanie wyświetlony, gdy wartość nie mapuje do char ASCII.

Odpowiedz

3

Byłem w stanie to rozwiązać, w końcu. Interfejsy API Google korzystają z modułu żądania i możesz je zaakceptować. Dla odniesienia, będziesz musiał ustawić [encoding: null]2, ponieważ każda inna opcja przejdzie przez odpowiedź toString, rujnując ją, jeśli pracujesz z danymi binarnymi.

kod Praca znajduje się poniżej:

function getFile(auth, cb) { 
    var service = google.drive({ 
    version: 'v3', 
    encoding: null 
    }); 
    service.files.get({ 
    auth: auth, 
    fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00", 
    alt: 'media' 
    }, function(err, response) { 
    if (err) { 
     console.log('The API returned an error: ' + err); 
     return; 
    } 
    cb(response) 
    }); 
} 
0

Ta odpowiedź jest oparty na artykule w MDN about sending and receiving binary data

function getFile(auth, cb) { 
    var service = google.drive('v3'); 
    service.files.get({ 
    auth: auth, 
    pageSize: 20, 
    fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00", 
    alt: 'media' 
}, function(err, response) { 
    if (err) { 
    console.log('The API returned an error: ' + err); 
    return; 
    } 
    var arrayBuffer = response; 
    if (arrayBuffer) { 
    var byteArray = new Uint8Array(arrayBuffer); 
    for (var i = 0; i < byteArray.byteLength; i++) { 
     // do something with each byte in the array 
    } 
    } 
} 

Jeśli nie dostać tablicę bajtów swoje będzie musiał przekonwertować ciąg do ByteArray z poniższym kodzie.

var bytes = []; 
for (var i = 0, len = response.length; i < len; ++i) { 
    bytes.push(str.charCodeAt(i)); 
} 
var byteArray = new Uint8Array(bytes); 
for (var i = 0; i < byteArray.byteLength; i++) { 
    // do something with each byte in the array 
} 
+0

Przykład ten wydaje się tylko do pracy przy ustalaniu 'responseType =„arraybuffer”', coś nie wydaje się być w stanie zrobić z napędem API. Twój przykład kodu zwraca ogólny obiekt o zerowej długości. – Drazisil