2016-04-24 32 views
5

API kullanarak Drive'dan bir ikili almakta sorun yaşıyorum, daireler çizmeye devam ediyorum. İşte node.js'yi kullanarak Google Drive'daki bir ikili dosyayı okuma

ilgili kod bitleri şunlardır:

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

Şimdi response geri dize olarak geliyor gibi görünüyor. Hexe dönüştürmeye çalıştığımda, deliriyor. response almak ve bir Buffer içine almak için herhangi bir yolu var mı? Yoksa service.files.get'dan aldığım seklinde bozuk mu?

fındık, ben demek

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 - 1.011.010-1111111111111101 - 0-11 doğru altıgen olacaktır

(kırık olduğunu görmek için denemek için ikili kullanıyorum) 4D 5A 90 00 03

Düzenleme: 90 değerin bir ASCII char eşleşmiyor görüntülenen alır o Unicode replacement character var fffd haline nasıl oldu gibi, şaşkın olanlar için. Bir bayt dizisi senin aşağıda koduyla bir ByteArray dize dönüştürmek zorunda kalacak alamazsanız

cevap

3

Bunu en sonunda çözebildi. Google API'leri istek modülünü kullanır ve kabul ettiği apply any options'u kabul edebilirsiniz. Referans için, başka bir seçenek de toString olsa da yanıtı geçeceğinden, [encoding: null]2'u ayarlamanız gerekecek ve böylece ikili verilerle çalışıyorsanız bozulacaktır.

Çalışma kod aşağıda yer almaktadır:

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

Bu cevap 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 
    } 
    } 
} 

bir makalede dayanmaktadır.

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

Bu örnek sadece '' responseType = "arraybuffer" ayarlarken iş gibi görünüyor, ben görünmez bir şey Sürücü API ile yapabilmek için. Kod örneğiniz sıfır uzunluktaki genel bir nesneyi döndürür. – Drazisil