2016-04-24 33 views
5

APIを使用してドライブからバイナリを取得する際に問題が発生しています。ここで Googleドライブからnode.jsを使用してバイナリファイルを読み取る

は、関連するコード・ビットです:

// 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) 
    }); 
} 

さて、responseが戻って文字列として来ているように見えます。私が16進数に変換しようとすると、ナットになります。 responseを取得してBufferに登録する方法はありますか?それとも、私はservice.files.getからそれを得る秒が壊れていますか?正しい六角は次のようになり11(私が壊れているかを確認しようとするバイナリを使用しています)

から1111111111111101 - - 1011010から0ナットで

、私は

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という意味します4D 5A 90 00 03

編集:私のように、どのように90fffdになったのか混乱している人のために、値がASCII文字にマップされていないときに表示されるのはUnicode replacement characterです。

答えて

3

これを最後に解決できました。 Google APIはリクエストモジュールを使用し、受け入れることができるのはapply any optionsです。参考までに、[encoding: null]2を設定する必要があります。他のオプションはtoStringを使用して応答を渡すため、バイナリデータを使用している場合はそれを破壊します。

作業するコードを以下の場所にあります。

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

あなたは以下のコードとのByteArrayに文字列を変換する必要がありますバイト配列を取得しない場合は、この答えは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 
    } 
    } 
} 

で記事に基づいています。

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

この例では、唯一の '' responseType =「arraybuffer」を設定する際に動作しているようですが、私は表示されません何かがドライブのAPIで行うことができるようにします。コード例は、長さゼロの汎用オブジェクトを返します。 – Drazisil

関連する問題